Разработка проэктов

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Разработка проэктов » Другое » Прыжок


Прыжок

Сообщений 1 страница 2 из 2

1

Подскажите пожалуйста как можно реализовать прыжок, пытался сделать с таймером, но появилась проблема: при нажатии на прыжок  включается таймер и спрайт начинает подниматься по координатам и опускаться как и надо, но если во время прыжка мы что либо нажмем программа переключается именно на это действие и появляется проблема, такая как (может бегать по воздуху). Так же использовал For тоже не добился нужного эффекта

if (key=32) and (key=39) then
for f := 0 to 39 do
begin
sleep(50);
if f>19 then
begin
y:=y-3;
x:=x-3;
end
else
begin
y:=y+3;
x:=x-3;
end;
  -------->не прыгает

if (key=32) then
for f := 0 to 39 do
begin
sleep(50);
if f>19 then
begin
y:=y-3;
x:=x-3;
end
else
begin
y:=y+3;
x:=x-3;
end;
---------> прыгает, но если мы будем стоять на месте не нажимая "вперёд" всё равно будет прыгать с продвижение вперёд

ваше предложение на счёт проверки есть ли под нами земля или нет не пройдет так как мы двигаемся просто по координатам а не по тайлам если только не подрисовать под ноги человечеку невидимый прямоугольник, но так же надо учитывать что человечек сам не двигается т.к. реализована динамическая камера точнее говоря двигается сама карта

procedure TForm1.spriteHero();                               //Прорисовка героя
begin

  SpriteDvig.Draw(form1.Canvas,70,100-y,step);
end;

procedure TForm1.map();                                       //Прорисовка Карты
begin
for i :=0 to 10 do
begin
SpriteMap.Draw(form1.canvas,i*256+x,0,i);
end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

if x<>0 then
begin                        //Движение влево
if key=37 then
begin
x:=x+3;
sleep(50);
if step>5 then
step:=1;
step:=step+1;
label1.Caption:=inttostr(x);
end;
end;

if key=39 then             //Движение вправо
begin
x:=x-3;
sleep(50);
if (step>11)or(step<6) then
step:=7;
step:=step+1;
label1.Caption:=inttostr(x);

end;

http://s2.uploads.ru/t/6muiV.jpg

0

2

во первых использовать sleep это зло!
во вторых нужно пересмотреть полностью ваш алгоритм

правильно поставьте задачу перед собой.
1. при нажатии клавиш - смещать игрока
2. если у игрока есть вертикальная скорость направленная вверх то смещаем игрока (летит вверх - прыжок)
3. если внизу у игрока нет препятствия то смещаем игрока (летит вниз - падение)

а также необходимо выбрать можно ли вашим игроком управлять в полете.

теперь непосредственно программирование

процедура обработки таймера решит нам 2 и 3 задачу
а процедура обработки нажатия клавиш решит там 1 задачу.

определим какие будут у нас переменные
x,y - текущие положение игрока
tx,ty - будущие положение игрока
vy - скорость игрока по координате y отвечающая за падение и прыжки.

теперь сама процедура таймера
всегда увеличиваем скорость падения
vy=vy+1
выщитываем новые координаты игрока
tx=x
ty=y+vy
теперь проверяем в месте с новыми координатами есть свободное пространство?
если есть то меняем координаты игрока
x=tx
y=ty
и прорисовываем его на карте

но если в новых координатах у нас есть препятствие! то необходимо сбросить vy=0

получится чтото типа этого

begin
vy:=vy+1;
tx:=x;
ty:=y+vy;
if(mas[trunc()]) и т.д - можно взять из процедуры обработки клавиши then
begin
x:=tx;
y:=ty;
end
else
y:=0;
end

ну а процедура обработки клавиатуры остается прежней.

0


Вы здесь » Разработка проэктов » Другое » Прыжок