HomeTurtlegrafikGPanelRobotikGameGrid WebTigerPython
 Python - Online
bewegen

3. FIGUREN BEWEGEN

 

 

DU LERNST HIER...

 

den Actors ein dynamisches "Eigenleben" zu geben. Sobald die Funktion doRun() aufgerufen wird, startet ein Simulationszyklus, in dem die Methode act() periodisch aufgerufen wird.

 

 

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 startet in der Zelle (0, 0), bewegt sich von Zelle zur Zelle so, dass er das ganze Spielfeld durchläuft.

 

 

 

c)

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

Für die Überprüfung, ob sich der Pacman am Rand befindet verwendest du 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.

 
 

2.

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

3.

Ergänze die Aufgabe b) so, dass der Pacman jeweils wenn er die letzte Zelle (9, 9) ereicht hat, zurück zur ersten Zelle (0, 0) springt. Dazu verwendest du den Befehl
self.setLocation(Location(0, 0))
 

oder die Befehle

self.setX(0)
self.setY(0)
setzt den Actor in die Zelle mit der Koordinate 0
setzt den Actor in die Zelle mit der Koordinate 0