Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

прыжок в игре   Найти похожие ветки 

 
nordic3   (2006-11-29 18:21) [0]

Делаю игру, что-то типа Марио.
Координаты человечка: х и у.
Когда нажимаю в сторону, то меняется х, а когда вверх, то запускается таймер, где постепенно меняется координата у.
Ожидаемый эффект: жмешь вперед; не отпуская, нажимаешь вверх; должен лететь на искосок.
Получается: жмешь вперед; не отпуская, нажимаешь вверх; летит прямо вверх, вообще не замечает нажатую клавишу вперед.
Как избежать этого?
Предполагаю, что стоит все время проверять нажата ли кнопка, но как это сделать? Или может есть другой вариант?


 
XProger ©   (2006-11-29 18:49) [1]

Есть такое понятие в физике - скорость. Вот в зависимости от неё и должен передвигаться объект...


 
Pa5ha ©   (2006-11-29 20:05) [2]

function IsKeyDown(c : Char) : Boolean;
var
  vk : Integer;
begin
  // "$FF" filters out translators like Shift, Ctrl, Alt
  vk:=VkKeyScan(c) and $FF;
  if vk<>$FF then
     Result:=(GetAsyncKeyState(vk)<0)
  else Result:=False;
end;

// IsKeyDown
//
function IsKeyDown(vk : TVirtualKeyCode) : Boolean;
begin
  Result:=(GetAsyncKeyState(vk)<>0);
end;

// KeyPressed
//
function KeyPressed(minVkCode : TVirtualKeyCode = 0) : TVirtualKeyCode;
var
  i : Integer;
  buf : TKeyboardState;
begin
  Assert(minVkCode>=0);
  Result:=-1;
  if GetKeyboardState(buf) then begin
     for i:=minVkCode to High(buf) do begin
        if (buf[i] and $80)<>0 then begin
           Result:=i;
           Break;
        end;
     end;
  end;
end;


 
Pa5ha ©   (2006-11-29 20:05) [3]

Это иззз демки ODE sulaco. Модуль keyboard.pas


 
megabyte-ceercop ©   (2006-11-30 08:30) [4]


> XProger

Правильно написал. Все проблемы с прыжками и правильным перемещением пропадут, если герою добавить два свойства - скорость по оси X и скорость по оси Y.



Xspeed := 0;

If KeyLeft then Xspeed := -3;  //Меняем горизонтальную скорость в зависимости от клавиш.
If KeyRight then Xspeed :=  3;

If (KeyJump  and  HeroOnGround )  then Yspeed := -15;   //Если герой на
//земле и нажата кнопка прыжок - даем ускорение вверх с силой -15

If (not HeroOnGround) then Yspeed := Yspeed + 2;     //пока в воздухе - на вертикальную скорость воздействует гравитация.

//В конце всегда приращиваем скорость к координатам (скорость влияет на положение героя.)
X := X + Xspeed;
Y := Y + Yspeed;



 
megabyte-ceercop ©   (2006-11-30 08:33) [5]

А еще стандартное событие onKeyPress возвращает только последнюю клавишу. Используй onKeyDown и onKeyUp для определения нажима о тжима клавиш. Состояние нужных тебе клавиш запоминай. Возможно проблема в этом.


 
Pa5ha ©   (2006-11-30 17:28) [6]

Лучше не запоминать нажатия клавиш, а проверять непосредственно, когда нужно ибо очередь клавы... XProger лучше объяснит -)



Страницы: 1 вся ветка

Текущий архив: 2008.01.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
15-1196676782
vajo
2007-12-03 13:13
2008.01.06
Стоит ли брать эту видеокарту?


2-1197204719
azl
2007-12-09 15:51
2008.01.06
ORDER BY (Query1.Edit) Cannot modify a read-only dataset


2-1197226685
alikon1
2007-12-09 21:58
2008.01.06
Работа с конкретной строкой в DBGrid


2-1197120040
dim
2007-12-08 16:20
2008.01.06
Ввод в поле TEdit1


2-1196876199
greg123
2007-12-05 20:36
2008.01.06
Изменение цвета, кот. подсвечивается выделенный текст в RichEdit