同时按下 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;
然后当你按住左键同时按住右键时,角色会不停地向左移动,反之亦然:)
基本上,我想要这样当我同时按下 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;
然后当你按住左键同时按住右键时,角色会不停地向左移动,反之亦然:)