|
18.02.2010, 01:39
|
#1
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Плавный полёт снаряда - как реализовать?
Задача: реализовать вывод выстрела (из танка, самолёта, тп) и полёта снаряда ТАК, как это делается обычно в ява-играх.
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 для стирания предыдущей позиции снаряда, но пока не удалось применить такой изврат =)
|
(Offline)
|
|
18.02.2010, 03:19
|
#2
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Для этого удобнее использовать свежевышедшую библиотеку Lib_arcade.
Смотри, тебе нужно будет сделать 3 спрайта:
1) Твой танк
2) Танк врага
3) Пуля
Там есть специальная функция, которая определяет столкновение спрайтов (пули и танка) и там удобно можно перемещать спрайты в любом направлении.
Попробуй. Если будут проблемы - я тебе напишу пример.
|
(Offline)
|
|
18.02.2010, 10:51
|
#3
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
odd, увидел. Перемещение спрайтов - SetCell, проверка на столкновение - Collision.
Это замечательно, вот только кроме этих функций однозначно придётся использовать и функции карты. То есть целиком переделывать игру под эту библиотеку. Возможно, так и сделаю, но в следующей версии(или игре), а пока это лишнее, т.к. у меня уже написан код проверки на столкновение, а вместо спрайтов и карты всё построено на отдельных картинках и их перемещении по экрану и связано многими флажками.
При таком раскладе, как можно получить такой полёт пули?
http://i2.fastpic.ru/big/2010/0218/3...c36c182135.gif
P.S. Мне понравились и Lib_arcade и Mappy, именно с их помощью напишу свою аркаду позже.
|
(Offline)
|
|
18.02.2010, 15:46
|
#4
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Может я не совсем понял, что нужно но:
Имеем координаты левого верхнего угла изображения пули (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
Примерно так.
|
(Offline)
|
|
18.02.2010, 16:48
|
#5
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
repaint в цикле делать рука не подымается
|
(Offline)
|
|
18.02.2010, 18:38
|
#6
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Сообщение от Mig-29
repaint в цикле делать рука не подымается
|
Иначе никак. Ну, естественно, там еще должна быть некая задержка.
|
(Offline)
|
|
18.02.2010, 19:07
|
#7
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
Ну это примерно то же самое, что в моем первом посте.
Делал и с repaint'ом, тоже отрисовка именно всей дорожки была. Потому и попросил кодом показать.
|
(Offline)
|
|
18.02.2010, 19:45
|
#8
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Примерно так, только для полета вниз (как и алгоритм):
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.
|
(Offline)
|
|
18.02.2010, 20:11
|
#9
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
Проверил. Ух и тормоза, даже на эмуляторе=)
Функции ImageFromCanvas вообще в основном хелпе не видел, от вас впервые узнал.
Теперь буду юзать MPhelp by odd, он похоже полнее.
С этой функцией алгоритм становится ясен!
Скоро будет релиз Беркут 2.0
Благодарю
|
(Offline)
|
|
18.02.2010, 20:22
|
#10
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Эти "тормоза" обусловлены специально установленной задержкой в 500 миллисекунд, можно уменьшить, можно вообще убрать, а так код не очень ресурсоемкий.
Repaint; Delay(500); // <-----------Задержка DrawImage(I,X,Y);
|
(Offline)
|
|
18.02.2010, 20:44
|
#11
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
А я и не о delay, а о repaint. Проверял-то я со своими параметрами.
Проверьте на телефоне, танк-самолёт-автомат или что там испускает эту пулю-снаряд мигать будет (вместе с самой пулей), на разных телефонах с разной частотой. По крайней мере по логике моей игры.
Проще говоря, если так рисовать полёт пули, её перемещение вызывает мигание объектов на экране (танк и снаряд) и заторможенность передвижения остальных объектов (танков противника, например) во время этого самого repaint'а.
Возможно, это только у меня из-за логики программы.. но если рисовать снаряд, скажем, 20 раз в полёте, то будет 20 repaint при каждом выстреле, что уже плохо само по себе.
Подумаю ещё над комбинацией DrawImage -> delay -> ImageFromCanvas -> FillRect -> DrawImage
|
(Offline)
|
|
18.02.2010, 20:54
|
#12
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.
|
(Offline)
|
|
18.02.2010, 21:17
|
#13
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Плавный полёт снаряда - как реализовать?
Сообщение от ViNT
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.
|
Или как вариант отрисовывай только область, где пуля летит.
ТО есть исправь Repaint; на Repaint(X, Y, W, H);
|
(Offline)
|
|
19.02.2010, 02:10
|
#14
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Ответ: Плавный полёт снаряда - как реализовать?
Итак, сделал Для пушки оставил старый вариант с прорисовкой всей "снарядной дорожки", а для ракет сделал полёт, о котором тут спрашивал.
Минус: на время полёта снаряда фотка стреляющего самолёта (танка, тп) пропадает с экрана из-за repaint'а
Беркут v2.0 http://forum.boolean.name/showthread...191#post138191
Последний раз редактировалось Mig-29, 19.02.2010 в 12:53.
|
(Offline)
|
|
19.02.2010, 18:22
|
#15
|
AnyKey`щик
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение (для 2 участников)
|
Беркут 2.1
Вышел хотфикс на версию 2.0
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:21.
|