Der Actor
Zusammenfassung von: https://pygame-zero.readthedocs.io/en/stable/builtins.html#actors
Position
Ein Actor
kann beliebig positioniert werden. Dazu setzen wir einfach neue Werte für die x- und y-Koordinate des gewünschten Actors:
zorg.x = 100
zorg.y = 400
Grafik
Man kann die Grafik des Actors
auch wechseln und damit z.B. anzeigen dass der Spieler verletzt wurde:
zorg.image = "alien_hurt"
Ereignisse (Events)
Ereignisse sind spezielle Unterprogramme, die von Pygame-Zero automatisch aufgerufen werden, wenn ein entsprechendes Ereignis eintritt. Als Argumente erhalten wir Details zum Ereignis (Mauskoordinaten, welche Maus-Taste wurde gedrückt, welche Keyboard-Taste wurde getippt, …). Anhand dieser Details können wir entscheiden wie sich das Ereignis auf unser Spiel auswirkt.
Tastatur
Bei den Tastatur-Ereignissen entscheidet man zwischen Taste runterdrücken und wieder loslassen. Beide von den Ereignissen aufgerufene Unterprogramme erhalten als Argument die gedrückte Taste:
def on_key_down(key):
print(key, "wurde runtergedrückt")
def on_key_up(key):
print(key, "wurde losgelassen")
Die komplette Liste der überprüfbaren Tasten findet man hier:
https://pygame-zero.readthedocs.io/en/stable/hooks.html#buttons-and-keys
Beispiel
Wir wollen unseren Alien mit den Tasten ←, → nach links und rechts steuern.
def on_key_down(key):
if key == keys.RIGHT:
zorg.x = zorg.x + 1
elif key == keys.LEFT:
zorg.x = zorg.x -1
Aufgabe
Baue eine Tastatursteuerung ein. Überlege dir folgende Punkte:
- Welche Tasten möchtest du verwenden?
- Was soll ein Tastendruck machen?
- Was geschieht wenn der Actor den Rand des Fenster erreicht?
Maus
Die Ereignisse der Maus werden in drei Unterprogrammen zusammengefasst: «Maustaste heruntergedrückt», «Maustaste losgelassen» und «Maus verschoben»:
def on_mouse_down(pos, button):
print("Mouse button", button, "clicked at", pos)
def on_mouse_up(pos, button):
print("Mouse button", button, "released at", pos)
def on_mouse_move(pos, rel, buttons):
print("Mouse moved", button, "released at", pos, "relative distance", rel)
Bei allen drei Unterprogrammen können ein, mehrere und auch alle Argumente weggelassen werden!
Beispiel
Wir könnten z.B. überprüfen, ob bei einem Mausklick, ein Actor
getroffen wird oder nicht. Dazu reicht uns die Position, wo der Mausklick stattgefunden hat. Welche Taste es war, ist uns egal:
def on_mouse_down(pos):
if zorg.collidepoint(pos):
print("Treffer!")
else:
print("Daneben!")
- Zeile 1
- Wir definieren das Unterprogramm das bei einem Mausklick aufgerufen werden soll.
- Zeile 2
collidepoint
liefert True, wenn derActor
zorg
mit den Mauskoordinatenpos
«kollidiert» – also die Mauskoordinaten im Bereich des Aliens liegen.
Zeit-gesteuert
Ein weiteres wichtiges Ereignis sind gestellte Timer. So können wir irgendwann einen Timer starten. Wenn dieser abläuft, wird ein Unterprogramm aufgerufen:
def on_mouse_down(pos):
if zorg.collidepoint(pos):
zorg_hurt()
clock.schedule_unique(zorg_normal, 1)
else:
print("Daneben!")
def zorg_hurt():
zorg.image = "alien_hurt"
def zorg_normal():
zorg.image = "alien"
Solche Timer setzen wir mit clock.schedule...
. Als Argument geben wir den Namen des Unterprogrammes an (ohne Klammern! – wir rufen es ja noch nicht auf) und die Dauer des Timers in Sekunden.
schedule_unique(callback, delay)
Event nur einmal auslösen, d.h. falls das Event bereits geplant ist wird es gelöscht und neu angesetzt.
clock
kennt neben schedule_unique(callback, delay)
noch drei weitere Befehle:
schedule(callback, delay)
Event immer auslösen, auch wenn das selbe bereits geplant ist.
schedule_interval(callback, interval)
Event immer wieder in zeitgleichen Abständen (interval
) aufrufen.
unschedule(callback)
ein geplantes Event löschen.
Kollisionen erkennen
In vielen Spielen die mit Pygame Zero programmiert werden können, müssen wir überprüfen, ob zwei Objekte sich berühren. Mathematisch ist das nicht ganz einfach:
- Bei runden Objekten könnte man den Abstand < Radius überprüfen
- Als Vereinfachung überprüft man, ob sich die umgebenden Rechtecke überschneiden
Pygame Zero kann für einen Actor eine Kollision mit einem einzelnen Punkt oder mit einem Rechteck (und somit einen weiteren Actor) erkennen:
collidepoint(point)
z.B. bei einem mouse-event: Traf der Mausklick den Actor zorg
?
def on_mouse_down(pos):
if zorg.collidepoint(pos):
print("Treffer!")
else:
print("Daneben!")
colliderect(rect)
z.B. im update-Unterprogramm: berühren sich die umgebenden Rechtecke von zorg
und dem Gegner enemy
?
def update():
if zorg.colliderect(enemy):
print("Game-Over!")