如何在Pygame中为频道分配声音?

2024-10-01 09:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Pygame中同时播放多个声音。我有一个背景音乐,我想要一个雨声连续播放和发挥局部雷声。在

我试过下面的方法,但是当雷声响起时,我的雨声停止了。我试过使用频道,但我不知道如何选择播放哪个频道的声音,或者是否可以同时播放两个频道。在

        var.rain_sound.play()

        if random.randint(0,80) == 10:                
            thunder = var.thunder_sound                
            thunder.play()

谢谢你的帮助


Tags: 方法声音playifvar局部random频道
2条回答

每个频道一次只能播放一个声音,但可以同时播放多个频道。如果不命名频道,pygame会选择一个未使用的频道播放声音;默认情况下,pygame有8个频道。可以通过创建通道对象来指定通道。至于无限循环一个声音,你可以通过播放一个带有参数loops=-1的声音来实现。您可以在http://www.pygame.org/docs/ref/mixer.html
我还建议使用内置的time模块,特别是sleep()函数,它将执行暂停一段指定的时间(以秒为单位)。这是因为游戏混音器播放声音的函数在声音播放结束之前会尽快返回,当您尝试在同一频道播放第二个声音时,第一个声音将停止播放第二个声音。所以,为了保证你的雷声播放完毕,最好在播放时暂停执行。我把sleep()行放在if语句之外,因为在if语句中,如果没有播放雷鸣音,sleep()行不会暂停执行,所以循环将非常快地循环到下一个雷声,输出频率远远高于“偶尔”

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)

Pygame的find_channel功能使得在未使用的频道上播放音频变得非常容易:

sound1 = pygame.mixer.Sound("sound.wav")
pygame.mixer.find_channel().play(sound1)

注意,默认情况下,如果没有可用的频道,find_channel将返回None。通过传递它True,您可以返回播放音频最长的频道:

^{pr2}$

您可能还对set_num_channels函数感兴趣,该函数允许您设置最大音频通道数:

pygame.mixer.set_num_channels(20)

相关问题 更多 >