#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;
Затем, когда вы нажимаете влево, одновременно нажимая вправо, персонаж движется влево без остановки и наоборот 🙂