bewegen

3. FIGUREN BEWEGEN

 

 

DU LERNST HIER...

 

den Actors ein dynamisches "Eigenleben" zu geben. Sobald im Navigationsbalken die Schaltfläche Run gedrückt wird oder die Funktion doRun() aufgerufen wird, startet ein Simulationszyklus, in dem die Methode act() periodisch aufgerufen wird. Die Simulationsperiode kann mit dem Schieberegler verändert werden.

Mit Klick auf Step kann man die Bewegung schrittweise laufen lassen, mit Stop kann man eine Pause einschalten.

 

 

MUSTERBEISPIELE

 

 

Beispiel1: Die Fische sollen hin und her schwimmen
 

Die Methode act() wird in der Klasse Fish definiert, muss daher den Parameter self haben. Alle Methoden müssen mit self. aufgerufen werden. Mit move() bewegt sich der Fisch in jeder Simulationsperiode (200 Millisekunden) in die nächste Zelle.

Wenn sich der Fisch an rechten oder linken Rand befindet, dreht er die Bewegungsrichtung um 180°. Mit dem Schieberegler im Navigationsbalken kann man die Bewegungsgeschwindigkeit ändern. Sind mehrere Objekte der Klasse Fish vorhanden, so bewegen sich alle gemäss den Vorgaben in der Methode act().

 

Programm:

# Gg3.py
from gamegrid import *

# -------------- class Fish -----------------------------
class Fish(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/nemo.gif")
    def act(self):
        self.move()
        if (self.getX()== 9) or (self.getX() == 0):
            self.turn(180)
 
# ----------------- main ---------------------------------
makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif")
nemo = Fish()
addActor(nemo, Location(1, 3))
wanda = Fish()
addActor(wanda, Location(6, 7))
show()
doRun()
► In Zwischenablage kopieren

Beispiel 2: Der Fisch soll auch hier hin und her schwimmen und am Rand des Spielfensters auch sein Bild drehen um 180° drehen.

Im Unterschied zum vorhergehenden Beispiel, soll er aber immer vorwärts schwimmen, d.h. am rechten Fensterrand sein Spreitebild spiegeln und am linken Fensterrand die Spiegelung wieder aufheben.

Mit der Methode setHorzMirror(True) kann ein Spritebild gespiegelt werden. In der Zelle 9 wird das Bild gespiegelt, in der Zelle 0 wird die Spiegelung mit setHorzMirror(False)wieder aufgehoben.

 


Programm:

# Gg3a.py
from gamegrid import *

# --------------- class Fish ----------------------------
class Fish(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/nemo.gif")
    def act(self):
        self.move()
        if self.getX()== 9: 
            self.turn(180)
            self.setHorzMirror(True)
        if self.getX()== 0:
            self.turn(180) 
            self.setHorzMirror(False)

# ------------------- main ---------------------------------
makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif")
nemo = Fish()
addActor(nemo, Location(1, 3))
show()
doRun()
► In Zwischenablage kopieren

Beispiel 3: Der Fisch soll alle Zellen durchlaufen

Der Fisch startet in der Zelle (0, 0). Wenn er die Zelle mit der x-Koordinate 9 erreicht, dreht er um 90°. Da x nach dem nächsten Schritt immer noch 9 ist, muss er noch einmal drehen. Am linken Rand muss er jeweils um 270° drehen.

 

Programm:

# Gg3b.py
from gamegrid import *

# --------------- class Fish ----------------------------
class Fish(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/nemo.gif")
    def act(self):
        self.move()
        if self.getX()== 9: 
            self.turn(90)
            self.setHorzMirror(True)
        if self.getX()== 0:
            self.turn(270) 
            self.setHorzMirror(False)

# ------------------- main ---------------------------------
makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif")
nemo = Fish()
addActor(nemo, Location(0, 0))
show()
doRun()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Um die Actors im Spielfenster zu bewegen verwendest du folgende Methoden:

move() ändert die Bewegungsrichtung um 180 °
getX() gibt die x-Koordinate zurück
setHorzMirror(True) zeigt das Spiegelbild des Actors
setHorzMirror(False) zeigt das Originalbild des Sprites
isMoveValid() gibt True zurück, wenn sich der Actor in die nächsten Zelle bewegen kann, d.h. nicht am Rand ist

Damit diese Methoden automatisch aufgerufen werden, müssen sie in der Methode act() sein.

 

 

ZUM SELBST LÖSEN

 

1.

In einem Spielfenster wird ein Pacman an der Position (0, 0) erzeugt. Programmiere folgende Bewegungen:

a) Pacman bewegt sich von Zelle zur Zelle von links nach rechts und zurück  

b) Pacman bewegt sich auf einem Quadrat. Am Rand dreht er jeweils um 90° und setzt seine Bewegung fort  

c) Pacman startet in der Zelle (0, 0), bewegt sich von Zelle zur Zelle so, dass er das ganze Spielfeld durchläuft.  
 

Für die Überprüfung, ob sich der Pacman am Rand befindet kannst du auch die Merhode isMoveValid() verwenden. Diese gibt True zurück, wenn sich der Actor in die nächsten Zelle bewegen kann, d.h. nicht am Rand ist. Falls die Bedingung If not self.isMoveValid() erfüllt ist,ist er am Rand und muss drehen. Diese Überprüfung ist insbesondere bei der Aufgabe b) praktisch.

2.

Ergänze die Aufgabe c) so, dass das Pacman-Spritebild jeweils am Ende der Zeil gespiegelt wird.