Конференция "Игры" » Обработка нажатий нескольких клавиш [Delphi, Windows]
 
  • Djek © (25.05.07 13:01) [0]
    Пишу игру для 2-х игроков - перемещение танков.
    Одновременное нажатие разных клавиш стандартными процедурами Делфи - OnKeyDown, OnKeyPress, OnKeyUp - практически никак не обрабатывается, т.е. идет реакция только на первую нажатую клавишу и при ее удержании на остальные ноль реакции.
    Нашел в инете пример, на базе функции GetKeyState и тупо использовал его в своей игре:

    If ((GetKeyState(VK_RIGHT) AND 128)=128) then begin  ...  end;
    if ((GetKeyState(VK_LEFT) AND 128)=128) then  begin  ...  end;
    ...
    If ((GetKeyState(ord('D')) AND 128)=128) then begin ... end;
    if ((GetKeyState(ord('A')) AND 128)=128) then begin ...end;
    ...

    Используя это, проблема решилась на 80%. Но вот в 20% случаев, все равно не обрабатывается одновременное нажатие некоторых клавиш, например при движении по диагонали (VK_RIGHT,VK_DOWN) не срабатывает клавиша VK_Numpad0 которая у меня отвечает за выбор оружия танка. Заметил что такие глюки идут при нажатии одновременно 3-4 клавиш.
    Может кто подскажет как сделать нормальную обработку 3-4 клавиш в Делфи, может какие дополнительные компоненты нужны?
    А также совершенно не понятно как работает такое выражение - ((GetKeyState(ord('D')) AND 128)=128)? Что за число 128..
  • Jkot © (25.05.07 14:47) [1]
    Попробуй в любой игре на двоиз нажать сразу 4 клавиши ;)
  • grisme © (25.05.07 20:20) [2]

    > А также совершенно не понятно как работает такое выражение
    > - ((GetKeyState(ord('D')) AND 128)=128)? Что за число 128.
    > .


    вот смотри. есть результат нажатия в GetKeyState, допустим он в двоичной системе примет такой вид XXXX XXXX, где X либо 1, либо 0. 128 в двоичной системе равен 1000 0000. логически умножив XXXX XXXX на 1000 0000 получишь X000 0000. если почитать хелп по функции GetKeyState, узнаешь, что в результирующем байте hiorder бит(т.е. именно тот, что остался X) показывает состояние - 0 - отжата, 1 - нажата. если X = 1 то получишь 1000 0000 т.е. 128, и значит клавиша нажата, иначе отжата :o) сорри за длинное объяснение
  • XProger © (26.05.07 00:47) [3]
    onKeyDown - Keys[Key] := True;
    onKeyUp - Keys[Key] := False;
    ...
  • cyborg © (26.05.07 09:08) [4]
    Это глюки большинства клавиатур. Включая и эту причину я купил себе геймпад, там сколько хочешь кнопок можешь жать одновременно :)
  • @!!ex © (26.05.07 10:02) [5]
    У меня последная клава больше 3 клавиш не держит...
  • XProger © (26.05.07 13:23) [6]
    Ах это... насколько я понимаю, клавиатура делится на своеобразные "зоны". В каждой из зон может быть нажато определённое кол-во клавиш. NumPad, F1-12, остальные.
    Т.е. если системный спикер начинает пищать - это уже непреодолимые ограничения железа.
  • Dermark (18.02.08 22:20) [7]
    if GetAsyncKeyState(Word('Q')) < 0 then
    begin
    ...
    end;

    Это тоже не плохо
 
Конференция "Игры" » Обработка нажатий нескольких клавиш [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0]