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 :)

odd 19.02.2010 23:06

Ответ: Беркут 2.1
 
Цитата:

Сообщение от Mig-29 (Сообщение 138280)
Вышел хотфикс на версию 2.0 :)

Но всё равно ещё работать и работать.
Не под все экраны нормально идет, да и хотелось бы на весь экран.

Mig-29 20.02.2010 15:56

Ответ: Плавный полёт снаряда - как реализовать?
 
В версии 3.0 много доработано.
Конкретно по экранам - теперь можно играть на экране до
264x176, это уже смартовские разрешения.
Я понимаю, что ты хочешь сказать - на весь экран проще и экономнее растянуть текстуру спрайтами =)
В аркаде так и будет, а тут код как "Война и мир" уже.

Изначальная ориентация на прямоугольные экраны, у которых высота больше ширины.

P.S. поборол тот глюк с исчезновением объектов во время repaint'а

NetBuilding 21.07.2010 16:11

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

SBJoker 21.07.2010 17:08

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

NetBuilding 21.07.2010 17:42

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

надо так: пуля еще не долетела до конца, а мы нажимем еще раз кнопку и вылетает уже другая пуля и т.д.
оно не получается.

вот пример как сейчас:
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 на чем програмиш?

SBJoker 21.07.2010 18:11

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

Под iPhone пишу на C++/Obj-C в XCode в качестве движка iXors3d

NetBuilding 21.07.2010 19:53

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

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 22.07.2010 16:20

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

NetBuilding 22.07.2010 17:51

Ответ: Плавный полёт снаряда - как реализовать?
 
SBJoker благодарю за посильную помощь
Получилось но все равно чето нето.

Цитата:

var i,key,g:integer;
a,b:array [0..100] of integer;
ip:boolean;p:array [0..100] of image;
begin
g:=0;
for i:=0 to 10 do begin
a[i]:=100;
b[i]:=100;
p[i]:=loadImage('/icon.png');
end;

repeat
key:=getKeyClicked;
if keyToAction(key)=GA_FIRE then begin g:=g+1;end
if g>9 then g:=0;

fillrect(0,0,240,320);


for i:=0 to g do begin
drawImage(p[i], a[i], b[i]);
a[i]:=a[i]+1;
if a[i]>240 then a[i]:=100;
end;
repaint;
until b[0]=10;
end.
помогите пожалуйста

LLI.T.A.L.K.E.R. 22.07.2010 23:51

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

Var i,key,g:integer;
a,b: array [0..9of integer;
ipboolean;
p:array [0..9of image;
PuleShot: array [0..9of boolean;

Begin
g
:=0;
For 
i:=0 to 9 do begin
a
[i]:=100;
b[i]:=100;
p[i]:=LoadImage('/icon.png');
PuleShot[i]:=False;
end;

Repeat

FillRect
(0,0,240,320);

key:=GetKeyClicked;
If 
KeyToAction(key)=GA_FIRE then begin
    PuleShot
[g]:=True;
    
g:=g+1;
end;

If 
g>5 then g:=0;

For 
i:=0 to 9 do begin
    
If PuleShot[i]=True then begin
        DrawImage
(p[i], a[i], b[i]);
        
a[i]:=a[i]+1;
        If 
a[i]>240 then begin
            PuleShot
[i]:=False;
            
a[i]:=100;
        
end;
    
end;
end;

Repaint;

Until b[0]=10;

End

Добавил свойство пули PuleShot[i]- выстрелить её или нет (рисовать/не рисовать)

И зачем создавать лишний массив 100?
За 9 у меня на эмуляторе и то выстрел сразу не реагирует.

И чтобы игруля была мультиэкранка - нужно не за 240 пикс. пулю проверять, а в переменную
Var ScreenW: integer;
Begin
ScreenW:=GetWidth;
Repeat
If a[i]>ScreenW+5 then a[i]:=ScreenW/2;

NetBuilding 23.07.2010 11:36

Ответ: Плавный полёт снаряда - как реализовать?
 
LLI.T.A.L.K.E.R. Огромный тебе респект!
Теперь мою угруху можно будет пройти :rolleyes:

Igor 23.07.2010 11:49

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


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

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