Jython HomeDruckenJava-Online

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.

 

 
Ausführen mit Webstart
# 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. Dazu müssen die 2 Bilder pacman_0.gif und pacman_1.gif im Verzeichnis sprites gespeichert sein
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.