Главная страница
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.012 c
2-1196941670
Nil
2007-12-06 14:47
2008.01.06
распределение памяти в динмаическом массиве записей


2-1197030304
sia
2007-12-07 15:25
2008.01.06
выход из windows закрывает мое приложение


3-1188290958
ANB
2007-08-28 12:49
2008.01.06
Самый быстрый способ разобрать XML в оракл ?


3-1188556394
Yurikon
2007-08-31 14:33
2008.01.06
Логическое поле в grid`е


2-1197047053
Res
2007-12-07 20:04
2008.01.06
Подскажите