Python Tutorial
- jetzt Python programmieren lernen

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 kann man sich z. B. umschauen bei „http://soundbible.com/“.

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, 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 Werte 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 MID funktioniert keine Zeitangabe.

Musiklautstärke einstellen

Jetzt sollten wir Hintergrundmusik spielen haben. Zusätzlich können wir noch die Lautstärke angeben über die Anweisung pygame.mixer.music.set_volume(). Die Angaben sind 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 gerade Pause, 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 dieses 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 halt. Hält man sich nicht daran, erhält man einen Traceback „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 Spielesounds. Dadurch kann man dem Spiel einen ganz eigenen Charakter verpassen (oder es extrem nervig machen).