Profitez-en, après celui là c'est fini

Processing, dixième cours

décembre 1st, 2008 Posted in Processing

Après la souris, parlons du clavier1 . Processing est capable d’«intercepter» (c’est le terme consacré) les évènements du clavier — ce qui est passablement banal. Tout comme dans le cas de la souris, on distingue la frappe d’une touche (keyReleased) de la demi-frappe (keyPressed).
Néanmoins, le clavier et le bouton de la souris fonctionnent de manière passablement différente car le clavier reconnaît la répétition de la frappe, ce qui signifie que si l’on reste le doigt enfoncé sur la touche « a », l’ordinateur se comportera comme si on avait appuyé plusieurs fois de suite sur la touche. Ce paramètre est totalement impossible à maîtriser car il dépend de chaque système d’exploitation et des réglages effectués par l’utilisateur.
Voici un script tout simple qui utilise les deux fonctions d’évènement (keyPressed() et keyReleased()) ainsi que la propriété keyPressed :

void setup(){
  background(255); stroke(255,0,0);
}
void draw(){
  if (keyPressed ){
    line(50,50, random(100),random(100));
  }
}
void keyPressed(){
  background(0);
} 
void keyReleased(){
  background(255);
}

Au démarrage (setup()), je « peins » la fenêtre en blanc et je règle la couleur des traits sur le rouge (255,0,0)
La fonction d’évènement keyPressed() est invoquée lorsque l’on appuie sur le clavier. Elle a pour effet de « peindre » la fenêtre en noir. La fonction d’évènement keyReleased() est invoquée lorsque l’on lache une touche que l’on a enfoncé, et elle a ici pour effet de « peindre » la fenêtre en blanc. Enfin, avec le gestionnaire draw(), qui s’exécute régulièrement, je dis qu’une ligne doit être tracée au hasard sur l’écran si, et seulement si, une touche du clavier est enfoncée (if (keyPressed )).
Notez que, même si elle ne contient rien, une fonction draw() doit impérativement être rédigée dans le script pour que les fonction de gestion d’évènements du clavier soient pris en compte.

Les touches du clavier

Processing est bien entendu capable de savoir quelle touche a été enfoncée. Le résultat de cet évènement est stocké dans deux variables systèmes, key et keyCode.
Avec key, on peut effectuer une vérification de cette manière :

void draw(){
  // gestionnaire vide mais obligatoire
}

void keyReleased(){
  if(key=='r'){
     background(255,0,0);
  }  
  if(key=='v'){
     background(0,255,0);
  }  
  if(key=='b'){
     background(0,0,255);
  }  
}

Avec ce script une série de tests, appelés lorsque l’on touche au clavier (keyReleased()), sont effectués et sont dans certains cas suivis par un changement de la couleur de la scène. Si la touche enfoncée est ‘r‘, alors l’écran est « peint » en rouge (background(255,0,0)), si la touche est ‘v‘, l’écran est peint en vert et si la touche est ‘b‘, il est « peint » en bleu. Les lettres sont ici écrite en minuscules, car pour key, b et B ou v et V ne sont pas les mêmes lettres.
On remarquera que le caractère s’écrit entre deux apostrophes droites ( – souvent utilisé en remplacement de l’apostrophe typographique () ou de la minute ()).

keyCode s’utilise de la même manière, mais au lieu de contenir un caractère, cette variable contient un code numérique. Par exemple si je veux connaître le keyCode après que la touche ‘a‘ ait été enfoncée, Processing me renverra le chiffre 65. On peut par ailleurs comparer la variable keyCode à un certain nombre de touches spéciales telles que UP (flèche haut), DOWN (flèche bas), LEFT (flèche gauche), RIGHT (flèche droite), ALT, CONTROL et SHIFT (majuscule).

void draw(){
  // gestionnaire vide mais obligatoire
}
void keyReleased(){
  background(255);
  if(keyCode==UP){
    rect(40,0,20,50); 
  }
  if(keyCode==DOWN){
    rect(40,50,20,50);
  }
  if(keyCode==RIGHT){
    rect(50,40,50,20);
  }
  if(keyCode==LEFT){
    rect(0,40,50,20);
  }
}

Dans cet exemple, lorsque la touche du clavier a été utilisée, la scène est « repeinte » en blanc (background(255)), puis une série de tests sont effectués pour savoir si la flèche haut, la flèche bas, la gauche ou la droite ont été utilisée. Pour chacun de ces cas possibles, un dessin différent apparaît à l’écran.

Encore un article assez austère. Les trois suivants seront, j’en ai peur, encore pires.

  1. Le coin culture : tout le monde sait que la souris d’ordinateur est une conquête assez récente (théorie: 1965, brevet: 1968, application industrielle: 1981), mais il est plus rare qu’on se souvienne que le clavier, du moins le clavier couplé à un ordinateur, est à peine plus ancien, puisque son usage informatique ne remonte qu’au début des années 1960. Auparavant, on communiquait avec les ordinateurs à l’aide de cartes perforées ou simplement (?) par câblage. []
  1. 6 Responses to “Processing, dixième cours”

  2. By estraaven on Mai 27, 2009

    « Encore un article assez austère. Les trois suivants seront, j’en ai peur, encore pires. »

    Non, au contraire, c’est limpide et très utile. Je me suis mis à processing il y a à peine 2 semaines, et ce didacticiel est des plus complet, ce qui me permet d’approfondir des notions comprises à moitié jusque là, qui sont parfois abordée pardessus la jambe chez d’autres.

    C’est parfait, merci.

  3. By Jean-no on Mai 27, 2009

    Je m’efforce d’être clair ! En revanche pour les gens qui viennent lire sur ce blog des articles distrayants sur la mauvaise science-fiction, cette série d’articles là a été un peu déroutante ;-)

  4. By pleu on Nov 27, 2009

    bonjour, merci pour votre tutoriel.

    Je suis face à un problème:
    je veux pouvoir entrer une adresse mail à l’écran et en faire une variable pour l’envoyer à une autre partie du programme (envoyer un email automatiquement).
    J’arrive à avoir l’adresse à l’écran, mais quand je fais un « println » pour le contrôle, j’obtiens omenviz??@gmail.com
    Les ?? sont dus, je pense à la touche ALT (press+realease). Savez-vous comment « déclarer » la touche ALT pour obtenir une variable qui soit exploitable directement pour envoyer mon mail?

    Merci encore de vous pencher sur mon problème. cordialement, PLF

  5. By Jean-no on Nov 27, 2009

    Si j’ai bien compris le problème, il faut utiliser le keyCode et ne prendre que les caractères voulus. Ici j’exclus le 17 et le 18, qui apparaissent avec l’arobase :

    String chaine;

    void setup(){
    chaine="";
    }

    void draw(){
    //
    }

    void keyReleased(){
    int k = keyCode;
    if(k!=17 && k!=18){
    chaine=chaine+key;
    }
    println (chaine);
    }

  6. By steph on Juil 30, 2016

    Bonjour,

    je découvre Processing et j’essayais d’écrire un programme qui affiche ce que l’utilisateur tape sur le clavier à l’aide de keyReleased() et keyPressed. Le programme ci-dessous fonctionne sur mon ordinateur mais je ne comprends pas pourquoi car après l’affichage du premier caractère, la condition (keyPressed == false && stop == false) n’est plus vérifiée et donc la fonction keyReleased() ne devrait pas être appelée. Pouvez-vous m’éclairer? Merci beaucoup.

    int i=40;
    int j=0;
    boolean stop=false;

    void keyReleased(){
    PFont police;
    police = loadFont(« Calibri-48.vlw »);
    fill(255,255,255);
    textAlign(LEFT,CENTER);
    text(key, i,100);
    i=i+10;
    stop=true;
    }

    void setup(){
    background(0,0,55);
    size(400,400);
    }

    void draw(){
    // frameRate(7); affiche le nombre de fois où la méthode draw() sera appelée en une seconde

    if(keyPressed == false && stop == false){keyReleased();}

    }

  7. By Jean-no on Août 3, 2016

    @steph : bonjour.
    Une première chose qui me saute aux yeux c’est que toute la partie concernant le choix de la typo gagnerait à se trouver dans la fonction setup(), car il n’y a pas besoin de charger à nouveau la fonte choisie en mémoire à chaque fois qu’on tape une lettre !
    donc :

    void setup(){
    size(400, 400);
    background(0, 0, 55);
    PFont police = loadFont(“Calibri-48.vlw”);
    fill(255);
    textAlign(LEFT,CENTER); 
    }

    Ensuite, la fonction keyReleased() est appelée chaque fois que l’on a appuyé sur une touche du clavier, j’ai l’impression que votre ligne « if(keyPressed… » ne sert pas à grand chose. Mais il est très important qu’une fonction draw(), même vide, soit présente pour que keyReleased() fonctionne.
    Dernière chose : je pense que la variable « j », qui n’est pas utilisée, pourrait être employée pour la hauteur des lettres, en lui donnant la valeur initiale de 100, et puis, lorsque « i » dépasse de la fenêtre, ramener i à 40 et augmenter j de 20, par exemple :

    i=i+10;
    if(i>width){i=40;j=j+20;}
    

Postez un commentaire


Veuillez noter que l'auteur de ce blog s'autorise à modifier vos commentaires afin d'améliorer leur mise en forme (liens, orthographe) si cela est nécessaire.
En ajoutant un commentaire à cette page, vous acceptez implicitement que celui-ci soit diffusé non seulement ici-même mais aussi sous une autre forme, électronique ou imprimée par exemple.