-- If(){design}else{art} » 2012 » juillet

Archives juillet, 2012

Savoir si plusieurs touches sont pressées simultanément

Article publié le : dimanche 1 juillet 2012. Rédigé par : Jean-no

Pour les besoins d’un jeu, par exemple, on peut avoir besoin de tester si plusieurs touches du clavier sont pressées en même temps, mais Processing ne le permet pas directement et ses variables key (caractère de la touche enfoncée) et keyCode (code numérique de la touche enfoncée) ne conservent qu’une seule référence, la dernière.

L’astuce qui suit consiste à créer un tableau booléen (une énumération de valeurs qui sont soit true soit false) dont les valeurs sont changées à chaque keyPressed() et keyReleased(), c’est à dire lorsque l’on appuie sur une touche et lorsqu’on lâche une touche. Ce tableau a une longueur de 128 éléments, ce qui doit suffire à traiter tous les cas puisque le codage de caractères ASCII contient 128 caractères.
Pour vérifier si un caractère est enfoncé, on utilise la fonction « verifieClavier(n) » où n sera soit un caractère (‘a’, ‘z’), soit un code (10 pour la touche Return, 32 pour la touche espace, etc.). La fonction renverra true ou false, selon le cas.


boolean[] touches=new boolean[128];

void draw(){
background(0);
text(" a : "+verifieClavier('a')+"\n b : "+verifieClavier('b')+"\n return : "+verifieClavier(10)+"\n espace : "+verifieClavier(32), 10, 10);
}

void keyPressed(){
touches[keyCode]=true;
}

void keyReleased(){
touches[keyCode]=false;
}

boolean verifieClavier(char c){
int cc = int(c);
if(cc>96 && cc<123)cc-=32;
return touches[cc];
}

boolean verifieClavier(int c){
return touches[c];
}

On peut imaginer beaucoup de variantes à ces fonctions.
On remarquera qu’il existe deux verifieClavier(),  l’un pour traiter les chiffres (ex. : verifieClavier(32) pour savoir si la touche « espace » est enfoncée) et l’autre pour traiter les caractères (verifieClavier(‘a’)).
La seconde version fait une petite conversion afin qu’il n’y ait pas de différence entre minuscules et majuscules : A et a sont traitées comme une seule et même lettre.