Jython

Figuren bewegen


Das Grundkonzept von JGameGrid besteht darin, 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.

Beispiel 1: Der Fisch soll hin und her schwimmen.

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

 
Ausführen mit Webstart

Wenn sich der Fisch in der letzten oder ersten Zelle 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().

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

 

Erklärungen zum Programmcode:

def act(self): Definiert die Methode act(). Diese wird automatisch in jeder Simulationsperiode (ca. 200 Millisekunden) aufgerufen
move() bewegt den Fisch in die nächste Zelle
getX() gibt die x-Koordinate (Zellennummer), an der sich der Fisch befindet zurück.

 

Beispiel 2: Der Fisch soll auch hier hin und her schwimmen und am Rand des Spielfensters 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.

 

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

 

Erklärungen zum Programmcode:

setHorzMirror(True)  Spiegelt das Sprite-Bild . Standardmässig ist setHorzMirror(False) gesetzt
setHorzMirror(False) Macht die Spiegelung wieder rückgängig

 

Beispiel 3: Der Fisch startet in der Zelle (0, 0) und bewegt sich von Zelle zu Zelle. 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.

   

 

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

 

Erklärungen zum Programmcode:

turn(90)  dreht um 90° im Uhrzeigersinn

 


Aufgaben:

1)


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

a)

b)

c)

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

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

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

 

 

a) b) c)
 
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.


3)

Aus der Dokumentation kannst du entnehmen, dass Actor(True, "sprite") einen rotierbaren Actor erzeugt. D.h. das Spritebild wird jeweils in die Laufrichtung gedreht. Teste es in der Aufgabe 1b, mit:
Actor.__init__(self, True, "sprites/pacman.gif")