EINFÜHRUNG |
Programme erhalten eine zusätzliche Interaktivität, wenn der Benutzer den Programmablauf durch Drücken von Tastaturtasten steuern kann. Obschon Tastaturbetätigungen eigentlich Ereignisse sind, die jederzeit unabhängig vom Programmablauf auftreten, werden sie im GPanel durch Abfragefunktionen erfasst. |
TASTATURSTEUERUNG |
|
MEMO |
Für Tastatureingaben kannst du den Befehl getKeyCodeWait() verwenden. Der Computer wartet, bis du eine Taste drückst und gibt den Tastaturcode zurück. Beachte aber, dass das GPanel-Fenster aktiv sein muss. Man sagt auch, dass es den Fokus besiten muss. Du musst in das Fenster hineinklicken, falls es den Fokus verloren hat. Nur das momentan aktive Fenster erhält die Tastaturereignisse. |
FIGUREN STEUERN |
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() |
MEMO |
Damit das Programm besser lesbar ist, kannst du für die Tastaturcodes der Cursortasten Konstanten einführen. Um sie besonders herauszuheben, sind sie sogar im Programmkopf platziert und mit Grossbuchstaben bezeichnet. |
NICHTBLOCKIERENDE TASTATURABFRAGE |
Du willst die Geschwindigkeit eines sich hin- und her bewegenden Balls mit der Buchstabentaste 's' (für slow) verkleinern und mit 'f' (für fast) vergrössern, allerdings nur bis zu einem maximalen Wert. Dein Augenmerk musst du wieder auf die Event-Loop richten, in der alles Wesentliche passiert. Dort wird mit kbhit() periodisch abgefragt, ob eine Taste gedrückt wurde. Ist dies der Fall, liefert kbhit() True zurück und du kannst mit getKeyCode() den Tastaturcode holen. 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) |
MEMO |
Da es sich um eine Animation handelt, müssen wir wieder einen Animationstimer verwenden, um einen möglichst periodischen Durchlauf der Event-Loop zu erhalten. In der Schleife wird der nächst folgende Spielzustand erstellt und dann mit repaint() im Bildschirmfenster angezeigt. kbhit() liefert einen Wahrheitswert zurück, den wir auch als boolean bezeichnen. Wurde seit dem letztem Aufruf eine Taste gedrückt, so wird True zurückgegeben, sonst False. Um den Ball nach rechts (vorwärts) zu bewegen, wird seine x-Koordinate bei jedem Durchgang der Event-Loop um v (Mass für die Geschwindigkeit) erhöht. Für die Bewegung nach links muss die Koordinate um v verkleinert werden. Vorwärts- bzw. Rückwärtsbewegung fassen wir als Spielzustand auf, den wir in der Variablen isAhead speichern. In Python kannst du einem Wort ein zweites Wort mit dem + Zeichen anfügen, also beispielsweise ergibt "Hans" + "Peter" das Wort "HansPeter". Wenn du aber einem Wort eine Zahl zufügen willst, so muss du die Zahl zuerst mit der str()-Funktion konvertieren. |
AUFGABEN |
|