Hi, Im having a problem getting responsive keyboard movement.
I have a key_up listener which fails to trigger when 3 keys are down.
E.g. Imagine up and right keys are being pressed to move up + right. The user wants to change to moving up + left. The user presses the left key before lifting thg right key.
I have a key_up listener to detect when a key is no longer being pressed. However in this scenario it fails to trigger when 3 keys are pressed.
Even in this online example, there is the same problem, look how unresponsive it is when chaging from up right to up left really quickly.
http://www.freeactionscript.com/2009/02/multiple-key-press-detection/
Does anyone know a way to solve this?
Below is my code:
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyDownHandlerUp);
var upStatus:Boolean = false;
var leftStatus:Boolean = false;
var rightStatus:Boolean = false;
var downStatus:Boolean = false;
var lastKey:int;
function keyDownHandlerDown(event:KeyboardEvent,repeat:Boolean = false):void
{
if ((event.keyCode != lastKey)||(repeat == true)||((event.keyCode == lastKey)&&(upStatus == false)&&(downStatus == false)&&(leftStatus == false)&&(rightStatus == false)))
{
if (repeat == false)
{
if (event.keyCode == Keyboard.LEFT)
{
leftStatus = true;
}
else if (event.keyCode == Keyboard.RIGHT)
{
rightStatus = true;
}
else if (event.keyCode == Keyboard.UP)
{
upStatus = true;
}
else if (event.keyCode == Keyboard.DOWN)
{
downStatus = true;
}
}
if ((upStatus == false)&&(downStatus == false)&&(leftStatus == true)&&(rightStatus == false))
{
stopMove();
moveIt(0,panRectangle.y);
}
else if ((upStatus == false)&&(downStatus == false)&&(leftStatus == false)&&(rightStatus == true))
{
stopMove();
moveIt(house.width - WIDTH,panRectangle.y);
}
else if ((upStatus == false)&&(downStatus == true)&&(leftStatus == false)&&(rightStatus == false))
{
stopMove();
moveIt(panRectangle.x,house.height - HEIGHT);
}
else if ((upStatus == true)&&(downStatus == false)&&(leftStatus == false)&&(rightStatus == false))
{
stopMove();
moveIt(panRectangle.x,0);
}
else if ((upStatus == false)&&(downStatus == true)&&(leftStatus == true)&&(rightStatus == false))
{
stopMove();
moveIt(undefined,undefined,"DL");
}
else if ((upStatus == true)&&(downStatus == false)&&(leftStatus == true)&&(rightStatus == false))
{
stopMove();
moveIt(undefined,undefined,"UL");
}
else if ((upStatus == true)&&(downStatus == false)&&(leftStatus == false)&&(rightStatus == true))
{
stopMove();
moveIt(undefined,undefined,"UR");
}
else if ((upStatus == false)&&(downStatus == true)&&(leftStatus == false)&&(rightStatus == true))
{
stopMove();
moveIt(undefined,undefined,"DR");
}
lastKey = event.keyCode;
}
}
function keyDownHandlerUp(event:KeyboardEvent):void
{
stopAutoMove();
if (event.keyCode == Keyboard.LEFT)
{
leftStatus = false;
}
else if (event.keyCode == Keyboard.RIGHT)
{
rightStatus = false;
}
else if (event.keyCode == Keyboard.UP)
{
upStatus = false;
}
else if (event.keyCode == Keyboard.DOWN)
{
downStatus = false;
}
keyDownHandlerDown(event,true);
}