TigerJython | xx für Gymnasien |
Viele Spiele verwenden die Tastatur zum Steuern der Spielfiguren.
In den nachfolgenden Beispielen beschreiben wir zwei Möglichkeiten der Tastensteuerung:
Key-Events führen zum Aufruf der Callbackfunktion keyCallback, wenn die Funktion mit dem benannten Parameter keyPressed oder keyReleased in makeGamegrid() registriert werden. Die Callbackfunktion erhält den Parameter e, aus dem man mit getKeyCode() den Code der gedrückten Taste ermitteln kann. Bei den Cursortasten sind es die Zahlencodes 37, 38, 39 und 40.
Beispiel 1: Pacman mit den Cursotasten steuern
Die Klassen Pacman und Pill können wir aus dem vorhergehenden Beispiel übernehmen.
|
# Gg6.py from gamegrid import * # --------------------- class Pacman --------------------- class Pacman(Actor): def __init__(self): Actor.__init__(self, True, "sprites/pacman.gif", 2); def tryToEat(self): self.show(0) actor = getOneActorAt(self.getLocation(), Pill); if (actor != None): actor.hide() self.show(1) # --------------------- class Pill --------------------- class Pill(Actor): def __init__(self): Actor.__init__(self, "sprites/pill_0.gif"); def keyCallback(e): keyCode = e.getKeyCode() if keyCode == 37: # left paki.setDirection(180) elif keyCode == 38: # up paki.setDirection(270) elif keyCode == 39: # right paki.setDirection(0) elif keyCode == 40: # down paki.setDirection(90) paki.move() paki.tryToEat() makeGameGrid(10, 10, 60, Color.red, False, keyPressed = keyCallback) paki = Pacman() addActor(paki, Location(0,0)) for i in range(10): addActor(Pill(), getRandomEmptyLocation()) show() doRun() |
Erklärungen zum Programmcode:
def keyCallback(e): die Callbackfunktion definiert, was geschehen soll wenn Cursortasten gedrückt werden | |
getKeyCode() gibt den nummerischen Code der gedrückten Taste zurück | |
setDirection(270): Der Pacman dreht sich gegen Norden | |
doRun() bewirkt dasselbe, wie wenn die Schaltfläche Run im Navigationsbalken gedrückt wird. Der Simulationszyklus startet automatisch beim Programmstart |
Beispiel 2: Pollen (ständiges Prüfen, ob Taste gedrückt ist) Man verwendet die Methode isKeyPressed(). Diese liefert True, wenn eine bestimmte Taste gedrückt wurde. Als Parameter werden die numerischen Codes der Cursotasten angegeben.
|
# Gg6a.py from gamegrid import * # ---------------- Fish ---------------- class Fish(Actor): def __init__(self): Actor.__init__(self, "sprites/nemo.gif") def act(self): self.move() if isKeyPressed(38): # UP self.setY(self.getY() - 1); if isKeyPressed(40): # DOWN self.setY(self.getY() + 1); if self.getX() == 0 or self.getX() == 9: self.turn(180) self.setHorzMirror(not self.isHorzMirror()) # --------------------- main --------------------------------- makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif", False) setTitle("Push cursor to move up/down") nemo = Fish() addActor(nemo, Location(1, 3)) show() doRun() |
Erklärungen zum Programmcode:
isKeyPressed(38): Gibt True zurück, wenn die Taste Cursor-UP gedrückt ist | |
isKeyPressed(40): Gibt True zurück, wenn die Taste Cursor-DOWN gedrückt ist |
Beachte:
Verwendet man die standardmässige Simulationsperiode, so wird act() nur alle 200 Millisekunden aufgerufen. Klickt man nur kurz auf die Cursortasten, so ist das Risiko gross, dass dieses Ereignis verpasst wird. Verkleinert man die Simulationsperiode, so ist das Risiko gross, dass ein Tastendruck den Fisch um mehrere Zeilen verschiebt. |
Aufgaben: |
1) |
Der Acror Robot mit dem Spritebild mbrobot.gif wird mit den Cursortasten vorwärts, rückwärts, links und rechts gesteuert und soll den Parcours durchfahren. Damit sich das Spitebild immer in die Bewegungsrichtung dreht, musst du vor der Zuordnung des Sprites True verwenden. |
2) |
Du sollst den Roboter jetzt mit Pollen steuern, so wie im Beispiel 2. Die Steurung wird in der Methode act() definiert. Dabei bewegt sich der Roboter mit move() von Zelle zur Zelle und drücken der Cursorasten bewirkt die Richtungsänderung. Damit der Roboter an der richtigen Position und in der richtgen Richtung startet, gibst du im Hauptprogramm: |
3) |
In der Bildbibliothek findest du noch weitere Roboterbahnen:
|