Плавный полёт снаряда - как реализовать?
Задача: реализовать вывод выстрела (из танка, самолёта, тп) и полёта снаряда ТАК, как это делается обычно в ява-играх.
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 для стирания предыдущей позиции снаряда, но пока не удалось применить такой изврат =) |
Ответ: Плавный полёт снаряда - как реализовать?
Для этого удобнее использовать свежевышедшую библиотеку Lib_arcade.
Смотри, тебе нужно будет сделать 3 спрайта: 1) Твой танк 2) Танк врага 3) Пуля Там есть специальная функция, которая определяет столкновение спрайтов (пули и танка) и там удобно можно перемещать спрайты в любом направлении. Попробуй. Если будут проблемы - я тебе напишу пример. |
Ответ: Плавный полёт снаряда - как реализовать?
odd, увидел. Перемещение спрайтов - SetCell, проверка на столкновение - Collision.
Это замечательно, вот только кроме этих функций однозначно придётся использовать и функции карты. То есть целиком переделывать игру под эту библиотеку. Возможно, так и сделаю, но в следующей версии(или игре), а пока это лишнее, т.к. у меня уже написан код проверки на столкновение, а вместо спрайтов и карты всё построено на отдельных картинках и их перемещении по экрану и связано многими флажками. При таком раскладе, как можно получить такой полёт пули? http://i2.fastpic.ru/big/2010/0218/3...c36c182135.gif P.S. Мне понравились и Lib_arcade и Mappy, именно с их помощью напишу свою аркаду позже. |
Ответ: Плавный полёт снаряда - как реализовать?
Может я не совсем понял, что нужно но:
Имеем координаты левого верхнего угла изображения пули (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 Примерно так. |
Ответ: Плавный полёт снаряда - как реализовать?
repaint в цикле делать рука не подымается
|
Ответ: Плавный полёт снаряда - как реализовать?
Цитата:
|
Ответ: Плавный полёт снаряда - как реализовать?
Ну это примерно то же самое, что в моем первом посте.
Делал и с repaint'ом, тоже отрисовка именно всей дорожки была. Потому и попросил кодом показать. |
Ответ: Плавный полёт снаряда - как реализовать?
Примерно так, только для полета вниз (как и алгоритм):
PHP код:
|
Ответ: Плавный полёт снаряда - как реализовать?
Проверил. Ух и тормоза, даже на эмуляторе=)
Функции ImageFromCanvas вообще в основном хелпе не видел, от вас впервые узнал. Теперь буду юзать MPhelp by odd, он похоже полнее. С этой функцией алгоритм становится ясен! Скоро будет релиз Беркут 2.0 Благодарю :) |
Ответ: Плавный полёт снаряда - как реализовать?
Эти "тормоза" обусловлены специально установленной задержкой в 500 миллисекунд, можно уменьшить, можно вообще убрать, а так код не очень ресурсоемкий.
PHP код:
|
Ответ: Плавный полёт снаряда - как реализовать?
А я и не о delay, а о repaint. Проверял-то я со своими параметрами.
Проверьте на телефоне, танк-самолёт-автомат или что там испускает эту пулю-снаряд мигать будет (вместе с самой пулей), на разных телефонах с разной частотой. По крайней мере по логике моей игры. Проще говоря, если так рисовать полёт пули, её перемещение вызывает мигание объектов на экране (танк и снаряд) и заторможенность передвижения остальных объектов (танков противника, например) во время этого самого repaint'а. Возможно, это только у меня из-за логики программы.. но если рисовать снаряд, скажем, 20 раз в полёте, то будет 20 repaint при каждом выстреле, что уже плохо само по себе. Подумаю ещё над комбинацией DrawImage -> delay -> ImageFromCanvas -> FillRect -> DrawImage |
Ответ: Плавный полёт снаряда - как реализовать?
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.
|
Ответ: Плавный полёт снаряда - как реализовать?
Цитата:
ТО есть исправь Repaint; на Repaint(X, Y, W, H); |
Ответ: Плавный полёт снаряда - как реализовать?
Итак, сделал :) Для пушки оставил старый вариант с прорисовкой всей "снарядной дорожки", а для ракет сделал полёт, о котором тут спрашивал.
Минус: на время полёта снаряда фотка стреляющего самолёта (танка, тп) пропадает с экрана из-за repaint'а Беркут v2.0 http://forum.boolean.name/showthread...191#post138191 |
Беркут 2.1
Вышел хотфикс на версию 2.0 :)
|
Часовой пояс GMT +4, время: 13:33. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot