Skip to content

Nachschlagen

ProgrammierenPygame Zero

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:

python
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:

python
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:

python
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.

python
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»:

python
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:

python
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 der Actor zorg mit den Mauskoordinaten pos «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:

python
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?

python
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?

python
def update():
	if zorg.colliderect(enemy):
		print("Game-Over!")

Gymnasium Kirchenfeld, fts