同时按下 2 个键时的优先级 - 游戏脚本

Priority when 2 keys are pressed at the same time - script for a game

基本上,我想要这样当我同时按下 2 个键(特别是 A 和 D)时,最后按下的键应该具有优先权,而在那之前的键应该是 "suppressed"(否输入)。

例如:在游戏中,当你按A时,你的角色向左移动,当你按D时,他向右移动。 同时按下这两个键会使角色停止。 现在这里的事情是我不希望角色停止,我希望他根据我按下的最后一个键继续移动,即使我同时按住 2 个键。

我认为这将是一项微不足道的任务,但在尝试学习如何实现它之后我实际上有点不知所措(我是菜鸟,抱歉 :C ),所以我来这里寻求帮助关于如何在 AHK 或任何直接更改键输入的易于编译的脚本语言上执行此操作。我不是要修改或创建游戏,因此重新映射这些键的脚本就足够了!

Autohotkey 示例,按照您的“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 edit/comment:

中的解释工作
#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 and if (expression) 个用例之间的区别。

我来晚了,但这可以帮助将来的人 :) 基本上,您需要一个变量来跟踪角色首先面对的方向并根据该方向采取行动。代码示例可以是:

let currentDir = 0;
let maxSpeed = (deltaTime * someConstant);
 if (IsKeyDown(KEY_RIGHT) && 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;

然后当你按住左键同时按住右键时,角色会不停地向左移动,反之亦然:)