🔊 Sound & Musik
Warum Sound wichtig ist
Sound ist ein wesentlicher Teil des Spielerlebnisses. Gutes Audio-Design kann ein Spiel von "ok" zu "großartig" machen. Arcade bietet ein einfaches aber mächtiges Sound-System, das auf pyglet basiert.
🎵 Musik
Hintergrundmusik via Streaming. Große Dateien werden nicht komplett in den RAM geladen.
💥 Sound Effects
Kurze Sounds (Schüsse, Münzen, Schritte). Werden statisch geladen für schnelle Wiedergabe.
🎚️ Kontrolle
Lautstärke, Geschwindigkeit, Pan, Loop – vollständige Kontrolle über die Wiedergabe.
⚠️ Lautstärke vorher prüfen! Nutzt Web Audio API für echte Soundausgabe.
Sounds laden & abspielen
def setup(self):
# Sounds laden (einmal beim Start)
self.coin_sound = arcade.load_sound(
":resources:sounds/coin1.wav"
)
self.jump_sound = arcade.load_sound(
":resources:sounds/jump1.wav"
)
self.hurt_sound = arcade.load_sound(
":resources:sounds/hurt1.wav"
)
self.gameover_sound = arcade.load_sound(
":resources:sounds/gameover1.wav"
)
def on_update(self, delta_time):
# Münzen einsammeln
coins_hit = arcade.check_for_collision_with_list(
self.player, self.coin_list
)
for coin in coins_hit:
coin.remove_from_sprite_lists()
# Sound abspielen
arcade.play_sound(self.coin_sound)
def on_key_press(self, key, modifiers):
if key == arcade.key.UP:
if self.physics_engine.can_jump():
self.player.change_y = 20
arcade.play_sound(self.jump_sound)
Wiedergabe-Kontrolle
# play_sound() gibt einen Player zurück
my_player = arcade.play_sound(
sound=self.explosion_sound,
volume=0.5, # 0.0 - 1.0
pan=0.0, # -1.0 (links) bis 1.0 (rechts)
loop=False, # Sound wiederholen?
speed=1.0 # Wiedergabegeschwindigkeit
)
# Sound stoppen
arcade.stop_sound(my_player)
# Lautstärke während Wiedergabe ändern
my_player.volume = 0.3
# Prüfen ob Sound noch läuft
if my_player.playing:
print("Sound läuft noch")
# Räumlicher Sound (Stereo Pan basierend auf Position)
def play_spatial_sound(self, sound, source_x):
# Pan berechnen: -1 (links) bis 1 (rechts)
screen_center = 400
pan = (source_x - screen_center) / screen_center
pan = max(-1.0, min(1.0, pan)) # Begrenzen
arcade.play_sound(sound, pan=pan)
setup() und spiele sie beliebig oft ab. Niemals load_sound() in on_update() aufrufen!
Musik-Streaming
Für lange Musikstücke verwendet man Streaming – die Datei wird nicht komplett in den RAM geladen, sondern stückchenweise abgespielt.
def setup(self):
# Musik als Streaming laden (streaming=True)
self.background_music = arcade.load_sound(
":resources:music/funkyrobot.mp3",
streaming=True # Für große Musikdateien
)
# Musik starten
self.music_player = arcade.play_sound(
self.background_music,
volume=0.3,
loop=True # Endlos wiederholen
)
def toggle_music(self):
# Musik pausieren/fortsetzen
if self.music_player.playing:
self.music_player.pause()
else:
self.music_player.play()
def change_level_music(self, new_music_path):
# Alte Musik stoppen
arcade.stop_sound(self.music_player)
# Neue Musik laden und starten
self.background_music = arcade.load_sound(new_music_path, streaming=True)
self.music_player = arcade.play_sound(
self.background_music, volume=0.3, loop=True
)
Formate & Audio-Backends
| Format | Typ | Empfehlung | Kompatibilität |
|---|---|---|---|
| .wav | Unkomprimiert | Sound Effects | ✅ Überall |
| .ogg | Komprimiert, Open Source | Musik & SFX | ✅ Fast überall |
| .mp3 | Komprimiert | Musik | ⚠️ Meistens |
| .flac | Lossless | Hochqualität | ⚠️ Backend-abhängig |
# Audio-Backend explizit setzen (vor import arcade)
import os
os.environ["ARCADE_SOUND_BACKEND"] = "ffmpeg" # oder "openal", "pyglet"
import arcade
# Verfügbare Backends:
# "pyglet" - Standard, breite Formatunterstützung
# "ffmpeg" - Maximale Formatunterstützung (ffmpeg muss installiert sein)
# "openal" - Low-latency, gut für 3D-Audio
Built-in Sounds & Musik
Arcade liefert eine Sammlung von Sound-Effects und Musik mit, die sofort genutzt werden können:
# Sound Effects
":resources:sounds/coin1.wav" # Münze aufheben
":resources:sounds/coin2.wav"
":resources:sounds/coin3.wav"
":resources:sounds/coin4.wav"
":resources:sounds/coin5.wav"
":resources:sounds/hurt1.wav" # Schaden
":resources:sounds/hurt2.wav"
":resources:sounds/hurt3.wav"
":resources:sounds/hurt4.wav"
":resources:sounds/jump1.wav" # Springen
":resources:sounds/jump2.wav"
":resources:sounds/jump3.wav"
":resources:sounds/jump4.wav"
":resources:sounds/jump5.wav"
":resources:sounds/gameover1.wav" # Game Over
":resources:sounds/gameover2.wav"
":resources:sounds/gameover3.wav"
":resources:sounds/gameover4.wav"
":resources:sounds/gameover5.wav"
":resources:sounds/explosion1.wav" # Explosion
":resources:sounds/laser1.wav" # Laser
":resources:sounds/laser2.wav"
# Musik
":resources:music/1918.mp3"
":resources:music/funkyrobot.mp3"