Tastatursteuerung


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

Der Pacman kann mit den Cursortasten UP, DOWN, LEFT bzw. RIGHT bewegt werden. Ziel ist es, möglichst schnell alle Pillen zu schlucken.

Die Klassen Pacman und Pill können wir aus dem vorhergehenden Beispiel übernehmen.

 
Je nach dem, welche Cursortaste gedrückt wurde, bewegt sich der Pacman in eine der 4 benachbarten Zellen. Die Richtung kann mit der Methode setDirection() festgelegt werden.

 

 
# 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()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

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.

Der Fisch schwimmt hin und her. Mit den Cursortasten UP und DOWN kann seine vertikale Position verändert werden.

 

 

 

# 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()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

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)


Ezeuge ein Spielfenster mir 20 horizontalen und 20 vertikalen Zellen, grösse 25 Pixel, ohne Gitterlinien, mit dem Hintergrundbild "sprites/bg2.gif"). Da die Roboterbahn einen transparenten Hintergrund hat, muss du zusätzlich mit setBgColor(Color.white) den Spielfenster-Hintergrund weiss machen.

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.
Actor.__init__(self, True, "sprites/mbrobot.gif").

 


2)


Ezeuge ein Spielfenster mir 50 horizontalen und 50 vertikalen Zellen, grösse 10 Pixel, mit dem gleiche Hintergrund wie in der Aufgabe 1.

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:
addActor(robi, Location(40,48))
robi.setDirection(270)
.

 


3)

In der Bildbibliothek findest du noch weitere Roboterbahnen:
"sprites/bg.gif"
"sprites/bg3.gif"
"learntrack2.gif"
Passe die Startbedingungen im Programmcode so, dass du den Roboter auf einer dieser drei Bahnen steuern kannst.