Supongamos que tiene un sistema de entrada basado en encuestas
void update()
{
if( Keyboard[ 'A' ] )
// A is down
}
Digamos que quiere poder reconocer combinaciones de teclas de 3 a 8 longitudes (como abajo, abajo, adelante, adelante, A para hado-ken)
¿Cómo crearía mejor un sistema de entrada de combinación de teclas genérico (fácilmente modificable / programable) en la entrada encuestada ?
Una forma es almacenar los estados de entrada actuales y anteriores, y compararlos cada vez que sondea la entrada.
Para cada tecla que se puede presionar, almacene un objeto que tenga una marca de tiempo de la última vez que la tecla cambió de un estado inactivo a un estado activo.
Actualice estos objetos haciendo esto en cada encuesta:
Ahora puedes hacer coincidir tus combos con el contenido de
keys
.Tenga un objeto combinado para cada combinación y llame a update () en cada objeto combinado en cada encuesta.
El método update () de un objeto combo coincidirá con el combo, verificando si se cumplen todas las condiciones necesarias para el combo en esta encuesta. Es decir, todas las marcas de tiempo de las teclas para el combo hasta ahora están en orden, y ninguna otra tecla que rompa el combo se ha presionado este marco. Para cada condición cumplida, incremente un contador en el objeto combinado a la siguiente condición para verificar. Cuando se cumplen todas las condiciones en un combo, llame al método que debe realizar el combo. Si
some_key_has_been_pressed == true
no se ha presionado la tecla que es la siguiente condición para el combo, restablezca el contador de condición satisfecha del combo a 0.Lo anterior es mi método preferido, ya que es simple de implementar, fácil de mantener, eficiente y altamente modular.
Sin embargo, para otro buen método, consulte la muestra de secuencia de entrada XNA , que está escrita en C #, y es probable que la lógica sea transferible al lenguaje que está utilizando.
fuente
if(current_input[key].down){
, ¿no querrías verificar si la clave estaba activa en elprevious_input
estado? Tal como está escrito, creo que actualizaría continuamente una clave retenidadown_timestamp
.Haga una pila de los últimos eventos clave X, para cada evento clave agregue un objeto con la tecla y la hora de la pulsación / liberación, luego verifique si los últimos miembros de la pila coinciden con un patrón especial y si esas teclas se presionaron lo suficientemente rápido como para contar como una combinación Finalmente, retire el objeto más antiguo de la pila.
fuente