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")
2
3
4
5
Die komplette Liste der überprüfbaren Tasten findet man hier:
https://pygame-zero.readthedocs.io/en/stable/hooks.html#buttons-and-keys (opens new window)
# Beispiel
Wir wollen unseren Alien mit den drei Tasten ←, → und SPACE beschleunigen: Rechts und links setzt die horizontale Geschwindigkeit auf einen festen Wert. Die Leertaste erhöht die vertikale Geschwindigkeit nach oben.
def on_key_down(key):
if key == keys.RIGHT:
zorg.vx = SPEED
elif key == keys.LEFT:
zorg.vx = -SPEED
elif key == keys.SPACE:
zorg.vy = zorg.vy - 10
2
3
4
5
6
7
Aufgabe «Tastatursteuerung»
Baue eine Tastatursteuerung ein. Überlege dir folgende Punkte:
- Welche Tasten möchtest du verwenden?
- Was soll ein Tastendruck machen?
# 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)
2
3
4
5
6
7
8
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!")
2
3
4
5
- 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.
Aufgabe «Maussteuerung»
Versuche auch eine Maussteuerung einzubauen. Was könnte man damit erreichen?
# Clock
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"
2
3
4
5
6
7
8
9
10
11
12
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.
clock
kennt neben schedule(callback, delay)
noch drei weitere Befehle:
# schedule_unique(callback, delay)
Event nur einmal auslösen, d.h. falls das Event bereits geplant ist wird es gelöscht und neu angesetzt
# schedule_interval
(callback, interval)
Event immer wieder in zeitgleichen Abständen (interval
) aufrufen
# unschedule(callback)
ein geplantes Event löschen
Aufgabe «Maussteuerung»
Baue mit der Clock ein visuelles Feedback für einen Treffer ein.
# komplettes Beispiel
Wenn wir alle Teile zusammensetzen erhalten wir das folgende Beispiel:
"""
Autor: S. Forster
Datum: 11.12.2020
Beschreibung: Alien lässt sich steuern mit Gravitation
"""
import pgzrun
WIDTH = 600
HEIGHT = 500
SPEED = 80
zorg = Actor('alien')
zorg.x = 100
zorg.y = 100
zorg.vx = SPEED
zorg.vy = 0
BROWN = 120,102,102
EARTHBLUE = 12,23,200
MARSRED = 200,23,20
GRAVITATION = 20
GROUND = Rect((0, HEIGHT-60), (WIDTH, 60))
def zorg_hurt():
zorg.image = "alien_hurt"
def zorg_normal():
zorg.image = "alien"
def draw():
screen.clear()
screen.draw.filled_circle((120,20), 30, MARSRED)
screen.draw.filled_circle((480,320), 180, EARTHBLUE)
screen.draw.filled_rect(GROUND, BROWN)
zorg.draw()
def update(dt):
zorg.vy = zorg.vy + dt * GRAVITATION
zorg.y = zorg.y + dt * zorg.vy
zorg.x = zorg.x + dt * zorg.vx
if zorg.bottom > HEIGHT:
zorg.bottom = HEIGHT
zorg.vy = -zorg.vy
if zorg.left > WIDTH:
zorg.right = 0
if zorg.right < 0:
zorg.left = WIDTH
def on_key_down(key):
if key == keys.RIGHT:
zorg.vx = SPEED
elif key == keys.LEFT:
zorg.vx = -SPEED
elif key == keys.SPACE:
zorg.vy = zorg.vy - 10
else:
print("Die Taste", key, "ist nicht belegt ;-)")
def on_mouse_down(pos, button):
if zorg.collidepoint(pos):
zorg_hurt()
clock.schedule_unique(zorg_normal, 1)
else:
print("Daneben!")
pgzrun.go()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Zusatzaufgabe «Jump & Run»
Schaffst du es, die Steuerungen zu kombinieren und das Alien wie bei einem Jump & Run herumrennen zu lassen?