forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Плавный полёт снаряда - как реализовать? (http://forum.boolean.name/showthread.php?t=11952)

Mig-29 18.02.2010 01:39

Плавный полёт снаряда - как реализовать?
 
Задача: реализовать вывод выстрела (из танка, самолёта, тп) и полёта снаряда ТАК, как это делается обычно в ява-играх.
http://i2.fastpic.ru/big/2010/0218/3...c36c182135.gif

Проблема: снаряд реализован как фотка, которая перемещается по экрану в следующем цикле:

for i:=ShootY downto 0 do
begin
i:=i-10;
DrawImage(SHOOT, A, RocketY-5*i);
end;

Данный цикл входит в главный цикл repeat (условие выхода - нажатие пункта меню) программы. И отрисовка происходит так:
http://i2.fastpic.ru/big/2010/0218/1...0584c26612.png
Понятно, что таким образом отрисовывается вся "снарядная дорожка".

Вопрос следующего содержания:
как реализовать такой http://i2.fastpic.ru/big/2010/0218/3...c36c182135.gif алгоритм полёта снаряда?
Пример кода приведите.

P.S. Мне понятно, что нужно использовать FillRect для стирания предыдущей позиции снаряда, но пока не удалось применить такой изврат =)

odd 18.02.2010 03:19

Ответ: Плавный полёт снаряда - как реализовать?
 
Для этого удобнее использовать свежевышедшую библиотеку Lib_arcade.
Смотри, тебе нужно будет сделать 3 спрайта:
1) Твой танк
2) Танк врага
3) Пуля
Там есть специальная функция, которая определяет столкновение спрайтов (пули и танка) и там удобно можно перемещать спрайты в любом направлении.
Попробуй. Если будут проблемы - я тебе напишу пример.

Mig-29 18.02.2010 10:51

Ответ: Плавный полёт снаряда - как реализовать?
 
odd, увидел. Перемещение спрайтов - SetCell, проверка на столкновение - Collision.
Это замечательно, вот только кроме этих функций однозначно придётся использовать и функции карты. То есть целиком переделывать игру под эту библиотеку. Возможно, так и сделаю, но в следующей версии(или игре), а пока это лишнее, т.к. у меня уже написан код проверки на столкновение, а вместо спрайтов и карты всё построено на отдельных картинках и их перемещении по экрану и связано многими флажками.

При таком раскладе, как можно получить такой полёт пули?
http://i2.fastpic.ru/big/2010/0218/3...c36c182135.gif

P.S. Мне понравились и Lib_arcade и Mappy, именно с их помощью напишу свою аркаду позже.

ViNT 18.02.2010 15:46

Ответ: Плавный полёт снаряда - как реализовать?
 
Может я не совсем понял, что нужно но:
Имеем координаты левого верхнего угла изображения пули (X,Y) и его длину(W) и высоту(H).
Допустим, пуля летит снизу экрана вверх тогда:

1. Сохраняем в память изображение с экрана в прямоугольнике (X,Y,X+W,Y+H) (переменная I);
2. Отрисовываем пулю в координатах X,Y;
3. Перерисовываем экран
4. Отрисовываем изображение I в координатах X,Y;
5. Увеличиваем Y на H
6. Если Y < высоты дисплея, переходим на 1

Примерно так.

Mig-29 18.02.2010 16:48

Ответ: Плавный полёт снаряда - как реализовать?
 
repaint в цикле делать рука не подымается

ViNT 18.02.2010 18:38

Ответ: Плавный полёт снаряда - как реализовать?
 
Цитата:

Сообщение от Mig-29 (Сообщение 138072)
repaint в цикле делать рука не подымается

Иначе никак. Ну, естественно, там еще должна быть некая задержка.

Mig-29 18.02.2010 19:07

Ответ: Плавный полёт снаряда - как реализовать?
 
Ну это примерно то же самое, что в моем первом посте.
Делал и с repaint'ом, тоже отрисовка именно всей дорожки была. Потому и попросил кодом показать.

ViNT 18.02.2010 19:45

Ответ: Плавный полёт снаряда - как реализовать?
 
Примерно так, только для полета вниз (как и алгоритм):
PHP код:

var
 
I:Image;
 
Bullet:Image;
 
X,Y,H,W:Integer;
begin
  Bullet
:=LoadImage('/bullet.png');
  
H:=GetImageHeight(Bullet);
  
W:=GetImageWidth(Bullet);
  
X:=GetWidth div 2;
  
Y:=0;
    
  
repeat
    I
:=ImageFromCanvas(X,Y,W,H);
    
DrawImage(Bullet,X,Y);
    
Repaint;
    
Delay(500);
    
DrawImage(I,X,Y);
    
Y:=Y+H;
  
until Y>=GetHeight;
  
delay(10000);
end


Mig-29 18.02.2010 20:11

Ответ: Плавный полёт снаряда - как реализовать?
 
Проверил. Ух и тормоза, даже на эмуляторе=)
Функции ImageFromCanvas вообще в основном хелпе не видел, от вас впервые узнал.
Теперь буду юзать MPhelp by odd, он похоже полнее.
С этой функцией алгоритм становится ясен!
Скоро будет релиз Беркут 2.0
Благодарю :)

ViNT 18.02.2010 20:22

Ответ: Плавный полёт снаряда - как реализовать?
 
Эти "тормоза" обусловлены специально установленной задержкой в 500 миллисекунд, можно уменьшить, можно вообще убрать, а так код не очень ресурсоемкий.

PHP код:

Repaint;
    
Delay(500); // <-----------Задержка
    
DrawImage(I,X,Y); 


Mig-29 18.02.2010 20:44

Ответ: Плавный полёт снаряда - как реализовать?
 
А я и не о delay, а о repaint. Проверял-то я со своими параметрами.
Проверьте на телефоне, танк-самолёт-автомат или что там испускает эту пулю-снаряд мигать будет (вместе с самой пулей), на разных телефонах с разной частотой. По крайней мере по логике моей игры.

Проще говоря, если так рисовать полёт пули, её перемещение вызывает мигание объектов на экране (танк и снаряд) и заторможенность передвижения остальных объектов (танков противника, например) во время этого самого repaint'а.

Возможно, это только у меня из-за логики программы.. но если рисовать снаряд, скажем, 20 раз в полёте, то будет 20 repaint при каждом выстреле, что уже плохо само по себе.

Подумаю ещё над комбинацией DrawImage -> delay -> ImageFromCanvas -> FillRect -> DrawImage

ViNT 18.02.2010 20:54

Ответ: Плавный полёт снаряда - как реализовать?
 
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.

odd 18.02.2010 21:17

Ответ: Плавный полёт снаряда - как реализовать?
 
Цитата:

Сообщение от ViNT (Сообщение 138133)
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.

Или как вариант отрисовывай только область, где пуля летит.
ТО есть исправь Repaint; на Repaint(X, Y, W, H);

Mig-29 19.02.2010 02:10

Ответ: Плавный полёт снаряда - как реализовать?
 
Итак, сделал :) Для пушки оставил старый вариант с прорисовкой всей "снарядной дорожки", а для ракет сделал полёт, о котором тут спрашивал.

Минус: на время полёта снаряда фотка стреляющего самолёта (танка, тп) пропадает с экрана из-за repaint'а

Беркут v2.0 http://forum.boolean.name/showthread...191#post138191

Mig-29 19.02.2010 18:22

Беркут 2.1
 
Вышел хотфикс на версию 2.0 :)


Часовой пояс GMT +4, время: 13:33.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot