INTRODUCTION |
Les programmes gagnent en interactivité lorsque l’utilisateur peut contrôler son exécution avec les touches du clavier. Bien que les frappes sur les touches soient en fait des événements survenant indépendamment de l’exécution du programme, elles peuvent être capturées dans le GPanel à l’aide de fonctions de requêtes.. |
CONTRÔLE DU CLAVIER |
|
MEMENTO |
On peut utiliser la fonction getKeyCodeWait() pour contrôler les saisies clavier. Celle-ci attend qu’une touche soit pressée et retourne le code associé. Il faut se rappeler que la fenêtre GPanel doit être active pour pouvoir capturer les événements du clavier. En d’autres termes, la fenêtre du GPanel doit avec le focus. Si la fenêtre perd le focus, il est nécessaire de cliquer quelque part dans son intérieur pour la réactiver. Seule la fenêtre active peut recevoir les événements du clavier. |
CONTRÔLER LES FIGURES |
from gpanel import * KEY_LEFT = 37 KEY_RIGHT = 39 KEY_UP = 38 KEY_DOWN = 40 def drawCircle(): move(x, y) setColor("green") fillCircle(5) setColor("black") circle(5) makeGPanel(0, 100, 0, 100) text("Move the circle with the arrow keys.") x = 50 y = 50 step = 2 drawCircle() while True: key = getKeyCodeWait() if key == KEY_LEFT: x -= step drawCircle() elif key == KEY_RIGHT: x += step drawCircle() elif key == KEY_UP: y += step drawCircle() elif key == KEY_DOWN: y -= step drawCircle() |
MEMENTO |
Pour améliorer la lisibilité du programme, on peut introduire des constants pour représenter les codes des touches directionnelles. Pour qu’elles soient facilement distinguables des variables, on adopte en Python la convention de le les écrire en lettres capitales. |
INTERROGER LE CLAVIER DE MANIÈRE NON BLOCANTE |
On veut augmenter ou diminuer la vitesse de la balle à l’aide des touches F pour « faster » respectivement S pour « slower », mais seulement jusqu’à une vitesse limite. Fixez à nouveau votre attention sur la boucle d’événements où toutes les choses intéressantes se produisent. Cette fonction interroge périodiquement le système pour savoir si une touche a été activée ou non. Si tel est le cas, la fonction kbhit() retourne True et l’on peut obtenir le code de la touche avec la fonction getKeyCode(). from gpanel import * import time KEY_S = 83 KEY_F = 70 makeGPanel(0, 600, 0, 600) title("Key 'f': faster, 's': slower") enableRepaint(False) x = 300 y = 300 v = 10 vmax = 50 isAhead = True while True: startTime = time.clock() if kbhit(): key = getKeyCode() if key == KEY_F: if v < vmax: v += 1 elif key == KEY_S: if v > 0: v -= 1 clear() setColor("black") text(10, 10, "Speed: " + str(v)) if isAhead: x = x + v else: x = x - v move(x, y) setColor("red") fillCircle(20) repaint() if x > 600 or x < 0: isAhead = not isAhead while (time.clock() - startTime) < 0.010: delay(1) |
MEMENTO |
Puisque l’on désire créer une animation, il est nécessaire d’utiliser un animation timer pour que le parcours de la boucle soit le plus régulier possible. Le prochain état du jeu est créé dans la boucle et est affiché a posteriori dans la fenêtre avec repaint(). kbhit() retourne une valeur de vérité, à savoir une valeur booléenne. Si une touche a été enfoncée depuis le dernier appel, la fonction retourne True et elle renvoie False dans tous les autres cas. |
EXERCICES |
|