Sie nur einen Ton zu einem Zeitpunkt pro Kanal spielen können, aber Sie können mehrere Kanäle spielen. Wenn Sie die Kanäle nicht benennen, wählt pygame einen nicht verwendeten Kanal aus, um einen Sound abzuspielen. Standardmäßig verfügt Pygame über 8 Kanäle. Sie können einen Kanal angeben, indem Sie ein Channel-Objekt erstellen. Um einen Sound unbegrenzt zu loopen, können Sie das tun, indem Sie einen Sound mit dem Argument loops = -1 abspielen. Sie finden die Dokumentation für diese Klassen und Methoden unter http://www.pygame.org/docs/ref/mixer.html
Ich würde auch empfehlen, die integrierte Modulzeit zu verwenden, insbesondere die Funktion sleep(), die die Ausführung für eine bestimmte Zeit in Sekunden unterbricht. Das liegt daran, dass pygame.mixer-Funktionen, die einen Sound abspielen, so lange zurückkommen, bis der Sound endet. Wenn Sie versuchen, einen 2. Sound auf dem gleichen Kanal zu spielen, wird der 1. Sound gestoppt, um den 2. Sound zu spielen. Um sicherzustellen, dass Ihr Donner-Sound bis zum Ende gespielt wird, ist es am besten, die Ausführung während der Wiedergabe anzuhalten. Ich setze die sleep() Zeile außerhalb der if-Anweisung, da in der if-Anweisung die sleep() Zeile die Ausführung nicht pausiert, wenn der Donner-Sound nicht gespielt wird, also würde die Schleife sehr schnell zum nächsten Donner zurückkehren Ton, der viel häufiger ausgegeben wird als "gelegentlich".
import pygame
import random
import time
import var
# initialize pygame.mixer
pygame.mixer.init(frequency = 44100, size = -16, channels = 1, buffer = 2**12)
# init() channels refers to mono vs stereo, not playback Channel object
# create separate Channel objects for simultaneous playback
channel1 = pygame.mixer.Channel(0) # argument must be int
channel2 = pygame.mixer.Channel(1)
# plays loop of rain sound indefinitely until stopping playback on Channel,
# interruption by another Sound on same Channel, or quitting pygame
channel1.play(var.rain_sound, loops = -1)
# plays occasional thunder sounds
duration = var.thunder_sound.get_length() # duration of thunder in seconds
while True: # infinite while-loop
# play thunder sound if random condition met
if random.randint(0,80) == 10:
channel2.play(var.thunder_sound)
# pause while-loop for duration of thunder
time.sleep(duration)
Sie können auch mit 'pygame.mixer.Channel.get_busy()' prüfen, ob ein bestimmter Kanal gerade mit der Wiedergabe eines Sounds beschäftigt ist. – Isa