Приоритет при одновременном нажатии 2 клавиш — сценарий для игры

#scripting #autohotkey #game-development

#сценарии #автоотключение #разработка игры

Вопрос:

В принципе, я хочу, чтобы при одновременном нажатии 2 клавиш (в частности, A и D) последняя нажатая клавиша имела приоритет, а клавиша перед этим должна быть «подавлена» (без ввода).).

Например: в игре, когда вы нажимаете A, ваш персонаж перемещается влево, а когда вы нажимаете D, он перемещается вправо. Одновременное нажатие этих 2 клавиш останавливает персонажа. Теперь дело в том, что я не хочу, чтобы персонаж останавливался, я хочу, чтобы он продолжал двигаться, основываясь на последней нажатой клавише, хотя я одновременно держу 2 клавиши.

Я думал, что это будет тривиальная задача, но на самом деле я был немного ошеломлен, пытаясь узнать, как это реализовать (я новичок, извините: C), поэтому я пришел сюда в поисках помощи о том, как это сделать на AHK или любом простом в компиляции скриптовом языке, который напрямуюизменяет ввод ключа. Я не пытаюсь модифицировать или создавать игру, поэтому достаточно скрипта, который переназначает эти клавиши!

Ответ №1:

Пример автоотключения, следуя вашему вопросу «A и D, в частности«:

 for k,v in StrSplit("ad")
    Hotkey, % "~$" v,Silveirous
        
Silveirous:
t:=SubStr(A_PriorHotkey,3)
if GetKeyState(t) and (A_ThisHotkey!=A_PriorHotkey)
    Send {%t% up}
return
  

Документация:

for k,v in , StrSplit() , Hotkey,,, , "~$" , SubStr() , A_Prior/ThisHotkey , if , GetKeyState() , t:=... and ... != , Send {%t% up}


Редактировать:

Другое решение, созданное для работы, как описано в редактировании / комментарии OP:

 #If GetKeyState("d","p")
~a::Send {d up}
~a up::Send {d down}
#If GetKeyState("a","p")
~d::Send {a up}
~d up::Send {a down}
#If
  

Обязательно учитывайте разницу между #If if (expression) вариантами использования и.

Ответ №2:

Я опоздал, но это может помочь кому-то в будущем 🙂 По сути, вам нужна переменная, чтобы отслеживать, в каком направлении персонаж столкнулся первым, и действовать в соответствии с этим. Примером кода может быть:

 let currentDir = 0;
let maxSpeed = (deltaTime * someConstant);
 if (IsKeyDown(KEY_RIGHT) amp;amp; IsKeyDown(KEY_LEFT))
{
     if (currentDir == 1)
        speed.x = -maxSpeed;
     else if (currentDir == -1)
        speed.x = maxSpeed;
}
else if (IsKeyDown(KEY_LEFT))
{
    currentDir = -1;
    speed.x = -maxSpeed;
}
else if (IsKeyDown(KEY_RIGHT))
{
    currentDir = 1;
    speed.x = maxSpeed;
}
else
{
    speed.x = 0.0f;
    currentDir = 0;
}
//And at last player's position would change every frame
    player.x  = speed.x;
  

Затем, когда вы нажимаете влево, одновременно нажимая вправо, персонаж движется влево без остановки и наоборот 🙂