Supposons donc que vous disposez d'un système d'entrée basé sur l'interrogation
void update()
{
if( Keyboard[ 'A' ] )
// A is down
}
Supposons que vous souhaitiez pouvoir reconnaître des combinaisons de touches de 3 à 8 longueurs (comme vers le bas, vers le bas, vers l'avant, A pour hado-ken)
Quelle serait la meilleure façon de créer un système d'entrée de combinaison de touches générique (facilement modifiable / programmable) sur une entrée interrogée ?
Une façon consiste à stocker les états d'entrée actuels et précédents et à les comparer chaque fois que vous interrogez l'entrée.
Pour chaque touche qui peut être enfoncée, stockez un objet qui a un horodatage de la dernière fois que la touche est passée d'un état bas à un état haut.
Mettez à jour ces objets en procédant ainsi à chaque sondage:
Vous pouvez maintenant faire correspondre vos combinaisons avec le contenu de
keys
.Ayez un objet combo pour chaque combo et appelez update () sur chaque objet combo à chaque sondage.
La méthode update () d'un objet combo correspondra au modèle du combo, vérifiant si toutes les conditions nécessaires pour le combo sont remplies lors de ce sondage. C'est-à-dire que tous les horodatages des touches pour le combo jusqu'à présent sont en ordre, et aucune autre touche qui briserait le combo n'a été appuyée sur cette image. Pour chaque condition remplie, incrémentez un compteur dans l'objet combo à la condition suivante à vérifier. Lorsque toutes les conditions sont remplies dans un combo, appelez la méthode que le combo doit effectuer. Si
some_key_has_been_pressed == true
la touche qui est la condition suivante pour le combo n'a pas été enfoncée, réinitialisez le compteur de conditions satisfaites du combo à 0.Ce qui précède est ma méthode préférée, car elle est simple à mettre en œuvre, facile à entretenir, efficace et hautement modulaire.
Cependant, pour une autre bonne méthode, consultez l' exemple de séquence d'entrée XNA , qui est écrit en C #, et la logique est probablement transférable dans le langage que vous utilisez.
la source
if(current_input[key].down){
, ne voudriez-vous pas également vérifier si la clé était en place dans l'previous_input
état? Tel qu'écrit, je pense que cela mettrait à jour en permanence les clés détenuesdown_timestamp
.Faites une pile des derniers événements de touche X, pour chaque événement de touche, ajoutez un objet avec la touche et l'heure de la pression / relâchement, puis vérifiez si les derniers membres de la pile correspondent à un modèle spécial et si ces touches ont été enfoncées assez rapidement pour compter comme une combinaison. Enfin, retirez l'objet le plus ancien de la pile.
la source