Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
11-1177148211
Dy1
2007-04-21 13:36
2008.01.06
3D (игры, движки и т.п)


2-1197122711
Максим_В.
2007-12-08 17:05
2008.01.06
Пару вопросов про ооп


15-1196688836
Некто__
2007-12-03 16:33
2008.01.06
Можно ли найти такую ветку?


3-1188292275
Егоров А.Н.
2007-08-28 13:11
2008.01.06
locate в базах IB


3-1188552430
DmitriyG.
2007-08-31 13:27
2008.01.06
Проблемы с записью изменений TClientDataSet в базу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский