Soundeffekte für unser Spiel und Hintergrundmusik
Was wäre ein Spiel ohne Soundeffekte und zusätzlich einer fetzigen Hintergrundmusik? Nur ein halbes Spiel wahrscheinlich.
In Pygame sind sowohl Soundeffekte wie auch Hintergrundmusik kein großer Aufwand. Wichtig ist, dass einem entsprechende Musik- und Sounddateien vorliegen. Wichtig dabei ist, dass wir für die Soundeffekte das Format .WAV benötigen. Die Hintergrundmusik kann auch eine MP3-Datei sein bzw. MIDI-File.
Woher nehmen, wenn nicht stehlen? Hier kann Google bemühen. Einfach nach „midi download kostenlos“ suchen. Für WAV- und MP3-Dateien kann man sich z.B. bei „https://soundbible.com/“ umschauen.
Aber nun zur Integration in Python Pygame.
Hintergrundmusik für unser Spiel
Wir haben nun auf unserer Festplatte eine Musikdatei. Diese wollen wir in unser Spiel einbauen, die permanent im Hintergrund läuft.
Dazu packen gleich am Anfang den Aufruf hinein:
# initialisieren von pygame
pygame.init()
# Musik/Soundeffekte einrichten
pygame.mixer.music.load('sound/eine-MP3-Datei.mp3')
Wollen wir eine MIDI-Datei nutzen, sieht der Aufruf wie folgt aus:
pygame.mixer.music.load('sound/eine-midi-datei.mid')
Somit haben wir die Musikdatei geladen. Das bedeutet aber noch nicht, dass diese automatisch abgespielt wird. Dazu müssen wir noch den „Play“-Button in Pygame drücken.
Hier erst der Befehl und dann die Erklärung:
# initialisieren von pygame
pygame.init()
# Musik/Soundeffekte einrichten
pygame.mixer.music.load('sound/eine-MP3-Datei.mp3')
pygame.mixer.music.play(-1,0.0)
Über Play-wird das abspiele der Musik gestartet. Die Werte in der Klammer haben natürlich auch eine Bedeutung:
- Erster Wert bestimmt die Anzahl. Wobei die Zahl 0 bedeutet, dass das Musikstück einmal abgespielt wird. Tragen wir 5 ein, erhalten wir 6-mal das abspielen. Tragen wir hier -1 ein, dann wird das Musikstück immer wieder wiederholt (sprich unendlich abgespielt).
- Der zweite Wert sagt, ab welchem Zeitpunkt das Musikstück abgespielt werden soll. Wir wollen es von Anfang an, daher geben wir 0.0 an. Dabei ist auch noch das Musikformat für die Art der Angabe unterschiedlich. Bei MP3 und OGG sind es Sekundenangaben. Bei MOD ist es die „Pattern order number“. Und bei MIDI funktioniert keine Zeitangabe.
Musiklautstärke einstellen
Jetzt sollten wir Hintergrundmusik spielen haben. Zusätzlich können wir noch die Lautstärke über die Anweisung pygame.mixer.music.set_volume()
angeben. Die möglichen Werte liegen zwischen 0 und 1 – 0 für unhörbar und 1 für maximale Lautstärke.
pygame.mixer.music.load('sound/eine-MP3-Datei.mp3')
pygame.mixer.music.play(-1,0.0)
pygame.mixer.music.set_volume(.6)
Das Einstellen der Lautstärke für die Hintergrundmusik ist wichtig. Die Hintergrundmusik soll ja nicht die Soundeffekte vom Spiel überdecken.
Musikwiedergabe pausieren bzw. weiterspielen
Auch diese Funktion macht öfters Sinn. Hat unser Spiel beispielsweise eine Pausefunktion (Telefon klingelt und wir müssen unbedingt hin) und während der Pausefunktion soll auch die Hintergrundmusik schweigen, dann hilft hier die Anweisung pygame.mixer.music.pause()
und pygame.mixer.music.unpause()
weiter.
In unserem Spiel soll beispielsweise durch Drücken der Taste p die Pause aktiviert werden, pausieren wir auch die Musik. In folgendem Beispiel wird die Taste p doppelt belegt. Ist keine Pause, wird pausiert. Ist bereits die Pause aktiviert, dann wird diese aufgehoben und die Musik spielt weiter. Zusätzlich wird der Ball noch eingefroren bzw. beim Beenden der Pause seine ursprünglichen Werte wieder genutzt:
# Spiel pausieren
elif event.key == pygame.K_p:
print("Spiel pausieren")
if spielpause == True:
spielpause = False
pygame.mixer.music.unpause()
bewegung_x = spielpause_x
bewegung_y = spielpause_y
else:
spielpause = True
pygame.mixer.music.pause()
spielpause_x = bewegung_x
spielpause_y = bewegung_y
bewegung_x = 0
bewegung_y = 0
Soundeffekte für Spielereignisse
Wir wollen ein hörbares Feedback für Spielergebnisse. Dann macht unser Spiel noch mehr Spaß. Hier ist wichtig, dass nicht alle Formate für die Soundeffekte funktionieren. Auf der sicheren Seite ist man mit WAV-Dateien. MP3-Dateien ergeben auf jeden Fall beim MAC eine Fehlermeldung.
Hier kommt ein anderer Befehl wie bei der Hintergrundmusik zum Einsatz.
getroffen = pygame.mixer.Sound('sound/treffer.wav')
Über diese Pygame-Anweisung erstellen wir ein neues Sound-Objekt. Auf dieses können wir im folgenden Zugreifen.
Irritierend ist hier die Schreibweise. Hier wird auf einmal das „S“ bei der Anweisung großgeschrieben. Bei der Hintergrundmusik pygame.mixer.music.load
war alles noch Kleinschreibung. Merkwürdig aber so ist es eben. Hält man sich nicht daran, erhält man einen Traceback-Fehler „AttributeError: module 'pygame.mixer' has no attribute 'sound'“
Nachdem wir nun unser Objekt erzeugt haben, können wir auf dieses Zugreifen. Wir wollen den Sound abspielen – dazu benötigen wir die Anweisung.
Jetzt wird dies noch an der entsprechenden Stelle in unserem Spiel integriert und wir haben deutlich mehr Spielspaß:
# if ball.colliderect(player1):
if player1.colliderect(ball):
print("Zusammenstoß P1")
pygame.mixer.Sound.play(getroffen)
# … restlicher Aktionscode
if player2.colliderect(ball):
print("Zusammenstoß P2")
pygame.mixer.Sound.play(getroffen)
# … restlicher Aktionscode
Das war es auch schon – und nun viel Spaß beim Heraussuchen der passenden Musik und Soundeffekte für das Spiel. Dadurch kann man einem Spiel einen ganz eigenen Charakter verpassen (oder es extrem nervig machen).