-
Пишу игру для 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..
-
Попробуй в любой игре на двоиз нажать сразу 4 клавиши ;)
-
> А также совершенно не понятно как работает такое выражение > - ((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) сорри за длинное объяснение
-
onKeyDown - Keys[Key] := True; onKeyUp - Keys[Key] := False; ...
-
Это глюки большинства клавиатур. Включая и эту причину я купил себе геймпад, там сколько хочешь кнопок можешь жать одновременно :)
-
У меня последная клава больше 3 клавиш не держит...
-
Ах это... насколько я понимаю, клавиатура делится на своеобразные "зоны". В каждой из зон может быть нажато определённое кол-во клавиш. NumPad, F1-12, остальные. Т.е. если системный спикер начинает пищать - это уже непреодолимые ограничения железа.
-
if GetAsyncKeyState(Word('Q')) < 0 then begin ... end;
Это тоже не плохо
|