Animierte Actors


In vielen Spielen werden Spielfiguren nicht nur bewegt, sondern sie müssen während der Bewegung auch ihr Erscheinungsbild ändern. Der Benutzer muss den Eindruck haben, dass die Spielfiguren essen, laufen, schwimmen usw. Um dies möglichst einfach zu realisieren, können einem Actor mehrere Sprites zugeordnet werden, von denen jeweils nur eines sichtbar ist. Die Anzahl der Sprites wird beim Erzeugen des Actors als Parameter angegeben. Die einzelnen Sprites müssen mit einer Indexnummer gespeichert sein.

Beispiel 1: Dem Actor pacman werden zwei Sprites pacman_0.gif und pacman_1.gif zugeordnet, die abwechselnd sichtbar sind.

pacman_0.gif
pacman_1.gif

 

 
# Gg4.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.showNextSprite()
          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)
paki = Pacman()
addActor(paki, Location(0, 0))
show()
doRun()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

(self, "sprites/pacman.gif", 2): Die Anzahl der Sprites wird beim Erzeugen des Actors als Parameter angegeben. Steht im Pfad des Sprites packman.gif, so müssen die 2 Bilder als packman_0.gif und packman_1.gif im Verzeichnis sprites gespeichert werden
showNextSprite() Da nur zwei Sprites vorhanden sind, werden die beiden Sprites abwechselnd sichtbar

 

Beispiel 2: Dem Actor Head sind drei verschiedene Sprites head_0.png, head_1.png und head_2.png zugeordnet, die periodisch der Reihe nach angezeigt werden. Mit einem GameGrid mit der Zellengrösse 1 Pixel erreicht man fliessende Figurenbewegungen.

getX() gibt die aktuelle Koordinate der Mittelpunktes des Bildes zurück. Bei der Fenstergrösse 600x600 Pixel muss der Actor rechts bei 500 und links bei 95 umkehren.

 

# Gg4a.py

from gamegrid import *

# ------------- class Head ---------------------------
class Head(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/head.png", 3)

    def act(self):     
        self.move()         
        self.showNextSprite()
        if (self.getX() > 500) or (self.getX() < 95):
            self.turn(180)        
                  
# ---------- main ----------------------------  
makeGameGrid(600, 600, 1, Color.lightgray)
addActor(Head(), Location(135, 180))
addActor(Head(), Location(300, 450))
show()
doRun()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Dieses Programm verwendet Sprites aus der Programmcodedistribution zum Buch "Brackeen, Developing Games in Java".

 


Aufgaben:

1)

Dem Actor Fish() werden zwei Sprites fish_0.gif und fish_1.gif zugeordnet.  

Erzeuge im Spielfenster mit dem Hintergrundbild reef.gif drei animierte Fish-Actors an den Positionen (0, 0), (5, 0) und 1, 2) und lasse sie so wie im Beispiel 1 von Zelle zur Zelle bewegen. Das Du siehst hier den Vorteil des Objektorientierte Programmierens: Wenn du einmal einen Actor mit seiner Bewegung und Animation definierst, kannst du beliebig viele davon erzeugen.

 

2)

Dem Actor Creature() werden zwei Sprites creature_0.gif
creature_1.gif
zugeordnet. In der Methode act() soll der Actor nur sein Sprite-Bild wechseln.

Erzeuge in einem Spielfeld mit 8 horizontalen und 8 vertikalen Zellen der Grösse 50 in jeder Zelle einen Actor. Dazu verwendest du zwei for-Schleifen:
for y in range(8):
    for x in range(8):

 

        addActor(Creature(), Location(x, y))