Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal

Ответ
 
Опции темы
Старый 18.02.2010, 01:39   #1
Mig-29
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
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Плавный полёт снаряда - как реализовать?

Для этого удобнее использовать свежевышедшую библиотеку Lib_arcade.
Смотри, тебе нужно будет сделать 3 спрайта:
1) Твой танк
2) Танк врага
3) Пуля
Там есть специальная функция, которая определяет столкновение спрайтов (пули и танка) и там удобно можно перемещать спрайты в любом направлении.
Попробуй. Если будут проблемы - я тебе напишу пример.
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 10:51   #3
Mig-29
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
ViNT
Модератор
 
Регистрация: 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
Mig-29
AnyKey`щик
 
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение
(для 2 участников)
Ответ: Плавный полёт снаряда - как реализовать?

repaint в цикле делать рука не подымается
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 18:38   #6
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Плавный полёт снаряда - как реализовать?

Сообщение от Mig-29 Посмотреть сообщение
repaint в цикле делать рука не подымается
Иначе никак. Ну, естественно, там еще должна быть некая задержка.
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 19:07   #7
Mig-29
AnyKey`щик
 
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение
(для 2 участников)
Ответ: Плавный полёт снаряда - как реализовать?

Ну это примерно то же самое, что в моем первом посте.
Делал и с repaint'ом, тоже отрисовка именно всей дорожки была. Потому и попросил кодом показать.
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 19:45   #8
ViNT
Модератор
 
Регистрация: 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
Mig-29
AnyKey`щик
 
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение
(для 2 участников)
Ответ: Плавный полёт снаряда - как реализовать?

Проверил. Ух и тормоза, даже на эмуляторе=)
Функции ImageFromCanvas вообще в основном хелпе не видел, от вас впервые узнал.
Теперь буду юзать MPhelp by odd, он похоже полнее.
С этой функцией алгоритм становится ясен!
Скоро будет релиз Беркут 2.0
Благодарю
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 20:22   #10
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Плавный полёт снаряда - как реализовать?

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

Repaint;
    
Delay(500); // <-----------Задержка
    
DrawImage(I,X,Y); 
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 20:44   #11
Mig-29
AnyKey`щик
 
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение
(для 2 участников)
Ответ: Плавный полёт снаряда - как реализовать?

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

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

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

Подумаю ещё над комбинацией DrawImage -> delay -> ImageFromCanvas -> FillRect -> DrawImage
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 20:54   #12
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Плавный полёт снаряда - как реализовать?

Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.
(Offline)
 
Ответить с цитированием
Старый 18.02.2010, 21:17   #13
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Плавный полёт снаряда - как реализовать?

Сообщение от ViNT Посмотреть сообщение
Ну вообще лучше сделать все на спрайтах, быстродействие будет максимально возможное.
Или как вариант отрисовывай только область, где пуля летит.
ТО есть исправь Repaint; на Repaint(X, Y, W, H);
(Offline)
 
Ответить с цитированием
Старый 19.02.2010, 02:10   #14
Mig-29
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
Mig-29
AnyKey`щик
 
Регистрация: 08.02.2010
Сообщений: 16
Написано одно полезное сообщение
(для 2 участников)
Беркут 2.1

Вышел хотфикс на версию 2.0
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com