![]() |
Плавный полёт снаряда - как реализовать?
Задача: реализовать вывод выстрела (из танка, самолёта, тп) и полёта снаряда ТАК, как это делается обычно в ява-играх.
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 :)
|
Ответ: Беркут 2.1
Цитата:
Не под все экраны нормально идет, да и хотелось бы на весь экран. |
Ответ: Плавный полёт снаряда - как реализовать?
В версии 3.0 много доработано.
Конкретно по экранам - теперь можно играть на экране до 264x176, это уже смартовские разрешения. Я понимаю, что ты хочешь сказать - на весь экран проще и экономнее растянуть текстуру спрайтами =) В аркаде так и будет, а тут код как "Война и мир" уже. Изначальная ориентация на прямоугольные экраны, у которых высота больше ширины. P.S. поборол тот глюк с исчезновением объектов во время repaint'а |
Ответ: Плавный полёт снаряда - как реализовать?
Помогите.
нужен пример, как реализовать многократный выстрел. |
Ответ: Плавный полёт снаряда - как реализовать?
Эм.. Пыщь-Пыщь - некатит?
-- Если серьёзно то изложи подробнее что неполучается. |
Ответ: Плавный полёт снаряда - как реализовать?
сейчас так: нажимаем кнопку вылетает пуля и летит себе до конца экрана.
пока не долетит еще раз не выстреллиш. надо так: пуля еще не долетела до конца, а мы нажимем еще раз кнопку и вылетает уже другая пуля и т.д. оно не получается. вот пример как сейчас: program pula; var a,b,key:integer; ip:boolean; begin a:=100; ip:=false; repeat key:=getKeyPressed; if keyToAction(key)=GA_FIRE then ip:=true; setColor(0, 0, 0); fillRect(0, 0, 240, 320); if ip=true then a:=a+5; if a<240 then drawImage(loadImage('/icon.png'), a, 100); else begin a:=100; ip:=false; end; repaint; until b=10; end. SBJoker личный вопрос, под iPhone на чем програмиш? |
Ответ: Плавный полёт снаряда - как реализовать?
Ну нужно загонять пули в объекты или в массив и циклом их обновлять.
Под iPhone пишу на C++/Obj-C в XCode в качестве движка iXors3d |
Ответ: Плавный полёт снаряда - как реализовать?
сделал так:
var b,i,key,g:integer; a:array [0..10] of integer; ip:boolean; begin g:=0; a[0]:=100; ip:=false; repeat key:=getKeyClicked; if keyToAction(key)=GA_FIRE then begin ip:=true; g:=g+1; end if g>9 then g:=0; setColor(0, 0, 0); fillRect(0, 0, 240, 320); a[g+1]:=100; if ip=true then a[g]:=a[g]+5; for i:=0 to 10 do begin if a[g]<240 then drawImage(loadImage('/icon.png'), a[i], 100); else begin ip:=false; end; end; repaint; until b=10; end. чего-то не хватает. :( Ребята покажите пожалуйста на примере как это сделать у меня игруха без этого непроходимая получается. |
Ответ: Плавный полёт снаряда - как реализовать?
ну я то на мидлете не программирую, потому нужно ждать помощи завсегдатаев.
Я могу лишь общие советы дать. После каждого выстрела создавать пулю - записывать её положение и другие параметры в массив или если есть ООП то в класс, после чего работать со всеми пулями в цикле. |
Ответ: Плавный полёт снаряда - как реализовать?
SBJoker благодарю за посильную помощь
Получилось но все равно чето нето. Цитата:
|
Ответ: Плавный полёт снаряда - как реализовать?
Примерно так:
PHP код:
И зачем создавать лишний массив 100? За 9 у меня на эмуляторе и то выстрел сразу не реагирует. И чтобы игруля была мультиэкранка - нужно не за 240 пикс. пулю проверять, а в переменную Var ScreenW: integer; Begin ScreenW:=GetWidth; Repeat If a[i]>ScreenW+5 then a[i]:=ScreenW/2; |
Ответ: Плавный полёт снаряда - как реализовать?
LLI.T.A.L.K.E.R. Огромный тебе респект!
Теперь мою угруху можно будет пройти :rolleyes: |
Ответ: Плавный полёт снаряда - как реализовать?
|
Часовой пояс GMT +4, время: 05:08. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot