Estoy tratando de desarrollar un motor de juego JavaScript y me encontré con este problema:
- Cuando presiono SPACEel personaje salta.
- Cuando presiono →el personaje se mueve hacia la derecha.
El problema es que cuando presiono hacia la derecha y luego presiono la barra espaciadora, el personaje salta y luego deja de moverse.
Uso la keydown
función para presionar la tecla. ¿Cómo puedo verificar si hay varias teclas presionadas a la vez?
javascript
keydown
XCS
fuente
fuente
Respuestas:
Nota: keyCode ahora está en desuso.
La detección de pulsaciones múltiples es fácil si comprende el concepto
La forma en que lo hago es así:
Este código es muy simple: dado que la computadora solo pasa una pulsación de tecla a la vez, se crea una matriz para realizar un seguimiento de varias teclas. La matriz se puede usar para verificar una o más claves a la vez.
Solo para explicar, digamos que presiona Ay B, cada uno dispara un
keydown
evento que se establecemap[e.keyCode]
en el valor dee.type == keydown
, que se evalúa como verdadero o falso . Ahora ambosmap[65]
ymap[66]
están configurados entrue
. Cuando lo sueltaA
, elkeyup
evento se dispara, causando que la misma lógica determine el resultado opuesto paramap[65]
(A), que ahora es falso , pero dado quemap[66]
(B) todavía está "inactivo" (no ha activado un evento de keyup), Sigue siendo cierto .La
map
matriz, a través de ambos eventos, se ve así:Hay dos cosas que puedes hacer ahora:
A) Se puede crear un registrador de claves ( ejemplo ) como referencia para más adelante cuando desee descubrir rápidamente uno o más códigos clave. Suponiendo que haya definido un elemento html y lo haya señalado con la variable
element
.Nota: Puede agarrar fácilmente un elemento por su
id
atributo.Esto crea un elemento html al que se puede hacer referencia fácilmente en javascript con
element
Ni siquiera tiene que usarlo
document.getElementById()
o$()
agarrarlo. Pero en aras de la compatibilidad, el uso de jQuery$()
es más ampliamente recomendado.Solo asegúrese de que la etiqueta del script venga después del cuerpo del HTML. Consejo de optimización : la mayoría de los sitios web de renombre colocan la etiqueta del script después de la etiqueta del cuerpo para la optimización. Esto se debe a que la etiqueta del script bloquea la carga de elementos adicionales hasta que el script termina de descargarse. Ponerlo por delante del contenido permite que el contenido se cargue de antemano.
B (que es donde radica su interés) Puede verificar una o más claves a la vez donde
/*insert conditional here*/
estaba, tome este ejemplo:Editar : ese no es el fragmento más legible. La legibilidad es importante, por lo que podría intentar algo como esto para que sea más fácil para la vista:
Uso:
¿Es esto mejor?
(fin de la edición)
Este ejemplo cheques por CtrlShiftA, CtrlShiftByCtrlShiftC
Es tan simple como eso :)
Notas
Seguimiento de KeyCodes
Como regla general, es una buena práctica documentar el código, especialmente cosas como los códigos clave (como
// CTRL+ENTER
) para que pueda recordar cuáles eran.También debe colocar los códigos clave en el mismo orden que la documentación (
CTRL+ENTER => map[17] && map[13]
, NOmap[13] && map[17]
). De esta manera, nunca se confundirá cuando necesite volver y editar el código.Un gotcha con cadenas if-else
Si busca combinaciones de diferentes cantidades (como CtrlShiftAltEntery CtrlEnter), coloque combinaciones más pequeñas después de combinaciones más grandes, de lo contrario, las combinaciones más pequeñas anularán las combinaciones más grandes si son lo suficientemente similares. Ejemplo:
Gotcha: "Este combo de teclas se sigue activando aunque no presione las teclas"
Cuando se trata de alertas o cualquier cosa que se enfoca desde la ventana principal, es posible que desee incluir
map = []
para restablecer la matriz después de que se cumpla la condición. Esto se debe a que algunas cosas, comoalert()
, alejan el foco de la ventana principal y hacen que el evento 'keyup' no se active. Por ejemplo:Gotcha: valores predeterminados del navegador
Aquí hay una cosa molesta que encontré, con la solución incluida:
Problema: dado que el navegador generalmente tiene acciones predeterminadas en combinaciones de teclas (como CtrlDactiva la ventana de marcadores o CtrlShiftCactiva skynote en maxthon), es posible que también desee agregar
return false
despuésmap = []
, para que los usuarios de su sitio no se sientan frustrados cuando el "Duplicar archivo" la función, que se pone CtrlD, marca la página como marcadorSin
return false
, la ventana Marca haría pop-up, para el disgusto del usuario.La declaración de devolución (nuevo)
Bien, entonces no siempre quieres salir de la función en ese punto. Es por eso que la
event.preventDefault()
función está ahí. Lo que hace es establecer un indicador interno que le dice al intérprete que no permita que el navegador ejecute su acción predeterminada. Después de eso, la ejecución de la función continúa (mientrasreturn
que inmediatamente saldrá de la función).Comprenda esta distinción antes de decidir si usar
return false
oe.preventDefault()
event.keyCode
es obsoletoEl usuario SeanVieira señaló en los comentarios que
event.keyCode
está en desuso.Allí, dio una excelente alternativa:
event.key
que devuelve una representación en cadena de la tecla que se está presionando, como"a"
for Ao"Shift"
for Shift.Seguí adelante y preparé una herramienta para examinar dichas cadenas.
element.onevent
vselement.addEventListener
Los controladores registrados con
addEventListener
se pueden apilar y se llaman en el orden de registro, mientras que la configuración.onevent
directa es bastante agresiva y anula todo lo que tenía anteriormente.La
.onevent
propiedad parece anular todo y el comportamiento deev.preventDefault()
yreturn false;
puede ser bastante impredecible.En cualquier caso, los controladores registrados a través de
addEventlistener
parecen ser más fáciles de escribir y razonar.También existe
attachEvent("onevent", callback)
una implementación no estándar de Internet Explorer, pero esto está más allá de obsoleto y ni siquiera pertenece a JavaScript (pertenece a un lenguaje esotérico llamado JScript ). Le conviene evitar el código políglota tanto como sea posible.Una clase auxiliar
Para abordar la confusión / quejas, he escrito una "clase" que hace esta abstracción ( enlace de pastebin ):
Esta clase no hace todo y no manejará todos los casos de uso imaginables. No soy un chico de la biblioteca. Pero para uso interactivo general, debería estar bien.
Para usar esta clase, cree una instancia y apúntela al elemento con el que desea asociar la entrada del teclado:
Lo que esto hará es adjuntar un nuevo oyente de entrada al elemento con
#txt
(supongamos que es un área de texto) y establecer un punto de observación para el combo de teclasCtrl+5
. Cuando ambosCtrl
y5
están abajo, la función de devolución de llamada que ha pasado en (en este caso, una función que añade"FIVE "
al área de texto) se llamará. La devolución de llamada está asociada con el nombreprint_5
, por lo que para eliminarlo, simplemente use:Para separarse
input_txt
deltxt
elemento:De esta manera, la recolección de basura puede recoger el objeto (
input_txt
), en caso de que se deseche, y no quedará un viejo oyente de eventos zombie.Para mayor detalle, aquí hay una referencia rápida a la API de la clase, presentada en estilo C / Java para que sepa qué devuelven y qué argumentos esperan.
Actualización 2017-12-02 En respuesta a una solicitud para publicar esto en github, he creado una esencia .
Actualización 2018-07-21 He estado jugando con programación de estilo declarativo durante un tiempo, y de esta manera ahora es mi favorito personal: violín , pastebin
En general, funcionará con los casos que realmente desea (ctrl, alt, shift), pero si necesita golpear, digamos,
a+w
al mismo tiempo, no sería demasiado difícil "combinar" los enfoques en un Búsqueda de teclas múltiples.Espero que este mini-blog
explicado a fondo hayasido útil :)fuente
return false
vspreventDefault()
keyCode
está en desuso: si cambia akey
, obtendrá la representación de caracteres real de la clave, lo que puede ser agradable.myString[5]
es lo mismo5[myString]
y ni siquiera le dará una advertencia de compilación (incluso con-Wall -pedantic
)? Se debe a que lapointer[offset]
notación toma el puntero, agrega el desplazamiento y luego desreferencia el resultado, haciendomyString[5]
lo mismo que*(myString + 5)
.Debe usar el evento keydown para realizar un seguimiento de las teclas presionadas, y debe usar el evento keyup para realizar un seguimiento de cuándo se sueltan las teclas.
Vea este ejemplo: http://jsfiddle.net/vor0nwe/mkHsU/
(Actualización: estoy reproduciendo el código aquí, en caso de que jsfiddle.net salga :) El HTML:
... y el Javascript (usando jQuery):
En ese ejemplo, estoy usando una matriz para realizar un seguimiento de las teclas que se presionan. En una aplicación real, es posible que desee
delete
cada elemento una vez que se haya liberado su clave asociada.Tenga en cuenta que si bien he usado jQuery para facilitarme las cosas en este ejemplo, el concepto funciona igual de bien cuando se trabaja en Javascript 'sin procesar'.
fuente
onblur
controlador de eventos, que elimina todas las teclas presionadas de la matriz. Una vez que haya perdido el foco, tendría sentido tener que presionar todas las teclas nuevamente. Desafortunadamente, no hay JS equivalente aGetKeyboardState
.fuente
Lo utilicé de esta manera (tenía que verificar dónde se presiona Shift + Ctrl):
fuente
para quien necesita un código de ejemplo completo. Derecha + Izquierda agregada
fuente
Haga que el keydown incluso llame a múltiples funciones, cada función verificando una tecla específica y respondiendo adecuadamente.
fuente
Intentaría agregar un
keypress
Event
controlador sobrekeydown
. P.ej:Esto solo pretende ilustrar un patrón; No entraré en detalles aquí (especialmente no en el
Event
registro específico de level2 + del navegador ).Publicar de nuevo por favor si esto ayuda o no.
fuente
Si una de las teclas presionadas es Alt / Crtl / Shift, puede usar este método:
fuente
fuente
Este no es un método universal, pero es útil en algunos casos. Es útil para combinaciones como CTRL+ somethingo Shift+ somethingo CTRL+ Shift+ something, etc.
Ejemplo: cuando desea imprimir una página con CTRL+ P, la primera tecla presionada siempre va CTRLseguida de P. Lo mismo con CTRL+ S, CTRL+ Uy otras combinaciones.
fuente
No es la mejor manera, lo sé.
fuente
fuente