![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
прыжок в игре [Delphi, Windows]
nordic3 © (2006-11-29 18:21:00)Делаю игру, что-то типа Марио.
Координаты человечка: х и у.
Когда нажимаю в сторону, то меняется х, а когда вверх, то запускается таймер, где постепенно меняется координата у.
Ожидаемый эффект: жмешь вперед; не отпуская, нажимаешь вверх; должен лететь на искосок.
Получается: жмешь вперед; не отпуская, нажимаешь вверх; летит прямо вверх, вообще не замечает нажатую клавишу вперед.
Как избежать этого?
Предполагаю, что стоит все время проверять нажата ли кнопка, но как это сделать? Или может есть другой вариант?
Pa5ha (2006-11-30 17:28:00) [1]Лучше не запоминать нажатия клавиш, а проверять непосредственно, когда нужно ибо очередь клавы... XProger лучше объяснит -)
megabyte-ceercop (2006-11-30 08:33:00) [2]А еще стандартное событие onKeyPress возвращает только последнюю клавишу. Используй onKeyDown и onKeyUp для определения нажима о тжима клавиш. Состояние нужных тебе клавиш запоминай. Возможно проблема в этом.
megabyte-ceercop (2006-11-30 08:30:00) [3]
> 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;
Pa5ha (2006-11-29 20:05:00) [4]
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:00) [5]Это иззз демки ODE sulaco. Модуль keyboard.pas
XProger (2006-11-29 18:49:00) [6]Есть такое понятие в физике - скорость. Вот в зависимости от неё и должен передвигаться объект...