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.
|
# 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() |
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() |
Aufgaben: |
1) |
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 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: |
addActor(Creature(), Location(x, y))
|