TigerJython xx
für Gymnasien

Kollisionen im Gitter


Interaktion zwischen den Spielfiguren sind bei der Game-Programmierung von grosser Wichtigkeit. In JGameGrid sind Kollisionen auf zwei Arten implementiert:

  • Kollisionen im Gitter: Man überprüft, ob sich mehrere Actors in der gleichen Gitterzelle befinden
  • Kollisionen zwischen zwei Actor-Sprite-Bildern: Man überprüft, ob sich bestimmte Kollisionsbereiche der einzelnen Bilder überlagern

Das zweite Vorgehen wird im Abschnitt Figuren-Kollisionen erklärt.

Bei den Kollisionen im Gitter gibt die Methode getActorsAt() alle Actors, die sich in einer bestimmten Zelle befinden in einer Liste zurück. Wenn man nur Actor aus einer bestimmen Klasse haben will, kann man den Klassennamen angeben. Befindet sich in einer Zelle nur ein oder kein Actor, kann man einfacher die Methode getOneActorAt() verwenden, welche die Actor-Referenz oder None zurückgibt, wenn kein Actor in der Zelle ist.

Beispiel 1: Pacman schluckt Pillen.

Zu Beginn werden 10 Pillen der Klasse Pill mit der Methode getRandomEmptyLocation() an zufällig gewählte freie Positionen im Gitter gesetzt. Der Pacman läuft durch das Gitter und isst die Pillen. Mit der Methode getOneActorAt(self.getLocation(), Pill)kann überprüft werden, ob sich an der aktuellen Position eine Pille befindet. Wenn ja, lässt man sie mit actor.hide() verschwinden.

Anstelle der Methode hide() kann auch actor.removeSelf() verwendet werden. Dabei wird der Actor endgültig vernichtet und kann mit reset() nicht mehr zurückgeholt werden.

 

 

# Gg5.py

from gamegrid import *

# ------------- class Pacman --------------------------
class Pacman(Actor):
     def __init__(self):
         Actor.__init__(self, "sprites/pacman.gif", 2)
     def act(self):
         self.move()
         self.tryToEat()
         self.showNextSprite()
         if self.getX() == 9:
             self.turn(90)
             self.setHorzMirror(True)
         if self.getX() == 0:
             self.turn(270)
             self.setHorzMirror(False)                
     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")
                        
# ---------------- main ------------------------------
makeGameGrid(10, 10, 60, Color.red)
paki = Pacman()
addActor(paki, Location(0, 0))
for i in range(20):
    addActor(Pill(), getRandomEmptyLocation())
show()
doRun()                                
 
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

tryToEat() testet, ob sich an der aktuellen Position eine Pille befindet und eliminiert sie. Dabei öffnet der Pacman den Mund. Wie im letzten Kapitel verwendet man die Bilder pacman_0.gif und pacman_1.gif
if (actor != None) Diese Bedingung trifft zu, wenn die Zelle mit einer Pille belegt ist
actor.remove(self) kann anstelle von hide() verwendet werden. Der Actor wird aus dem Gitter eliminiert.

 


Aufgaben:

1)

Erzeuge einen animierten Actor Fish() mit den Spites fish_0.gif und fish_1.gif und einen Actor Alga() mit dem Sprite alga.gif. An zufällig gewählten Positionen ein im Spielfenster mit dem Hintergrundbild reef.gif werden 20 Algen erzeugt. Der Fisch soll das Meer säubern, d.h. das ganze Spielfeld durchlaufen und alle Algen fressen.

 


2)

Erzeuge einen Actor Ghost() mit dem Spite ghost.png und einen animierten Actor Creature() mit den Sprites creature_0.gif und creature_1.gif. An zufällig gewählten Positionen werden 30 Creatur-Actors erzeugt. Der Ghost startet in der Zelle (0, 0) läuft das ganze Spielfenster durch. Wenn auf eine Creature trifft, wechselt diese Ihre Farbe.

 

 

 

 

 

s