Limitación del evento “keydown” con 3 teclas pulsadas simultáneamente
Me he encontrado ante un caso curioso: Estaba programando el movimiento de un personaje basándome en el evento “keydown“. Generalmente no es necesario, pero esta vez necesitaba tener en cuenta todas las opciones posibles de teclas. Para que os hagáis a una idea, un poco de pseudo-código:
if (!bRight && !bLeft && !bUp && !bDown) { // Not move. } else if (bRight && !bLeft && !bUp && !bDown) { // Move Right. } else if (!bRight && bLeft && !bUp && !bDown){ // Move Left. } else if (!bRight && !bLeft && !bUp && bDown) { // Move Down. } else if (!bRight && !bLeft && bUp && !bDown) { // Move Up. } else if (bRight && !bLeft && !bUp && bDown) { // Move Right-Down. } else if (bRight && !bLeft && bUp && !bDown) { // Move Right-Up. } else if (!bRight && bLeft && !bUp && bDown) { // Move Left-Down. } else if (!bRight && bLeft && bUp && !bDown) { // Move Left-Up } else if (bRight && bLeft && bUp && !bDown) { // Move Up. } else if (bRight && bLeft && !bUp && bDown) { // Move Down. } else if (bRight && !bLeft && bUp && bDown) { // Move Right. } else if (!bRight && bLeft && bUp && bDown) { // Move Left. } else if ((!bRight && !bLeft && bUp && bDown) || (bRight && bLeft && !bUp && !bDown)) { // Not Move. } |
Imaginemos que tenemos una función que se ejecuta cada vez que el usuario aprieta una tecla y hace lo siguiente:
// PSEUDOCODIGO. function keyDownHandler (KEYDOWN) { if (KEYDOWN === "A") { bLeft = true; } if (KEYDOWN === "D") { bRight = true; } if (KEYDOWN === "S") { bDown = true; } if (KEYDOWN === "W") { bUp = true; } } |
Pues bien, si pulsaramos “W“, sin dejar de pulsar “W” pulsaramos “S”, y sin dejar de pulsar “W” y “S” pulsaramos “D” o “A” , lo esperado es que el primer condicional nos retornara “left” o “right”… peeeero TACHAN! El evento “KEYDOWN” no se ejecuta en el momento de apretar la tercera tecla “D” o “A”! Pero, si teniendo pulsadas “W” y “S” , pulsamos “M” o “N”, el evento SÍ se ejecuta.
Es decir, parece ser que según qué combinación, no es posible pulsar 3 teclas simultáneamente… sin duda alguna, una limitación a tener en cuenta!