user2159335
user2159335

Reputation:

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

Basically, I want it so that when I have 2 keys pressed together (both A and D, specifically), the last key pressed should have priority, and the key before that should be "suppressed" (no input).

For example: in a game, when you press A, your character moves to the left, and when you press D, he moves to the right. Pressing those 2 keys together makes the character stop. Now the thing here is that I don't want the character to stop, I want him to continue to move, based on the last key I pressed, even though I'm holding 2 keys at the same time.

I thought this was going to be a trivial task but I actually got a little overwhelmed after trying to learn how to implement this (I'm a noob, sorry :C ), so I came here looking for some help on how to do this on AHK or any easy to compile scripting language that directly changes the input of a key. I'm not trying to modify or create a game, so a script that remaps those keys is enough!

Upvotes: 0

Views: 1453

Answers (2)

Bob
Bob

Reputation: 431

Autohotkey example, following your "A and D, specifically" question:

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

Documentation:

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


Edit:

Another solution, made to be working as explained in OP's 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

Make sure to mind the difference between #If and if (expression) usage cases.

Upvotes: 1

llsanketll
llsanketll

Reputation: 297

I'm too late but this could help someone in future :) Basically you need a variable to keep track of which direction the character faced first and act according to that. A code example could be:

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;

Then when you press left while pressing right the character moves left without stopping and vice versa :)

Upvotes: 0

Related Questions