在 pygame 中有没有办法判断声音是否已经播放完毕?我阅读了set_endevent
文档get_endevent
,但我无法理解它或找到一个例子。
我正在尝试专门执行以下操作:
- 播放声音
- 在播放声音时,继续循环迭代
- 声音播放完毕后,继续前进。
我确实检查了其他被问到的问题——没有找到任何专门针对 python / pygame 的问题。
谢谢!
诀窍是,pygame.mixer.Channel
当您调用play()
声音 ( pygame.mixer.Sound
) 的方法时,您会得到一个类型的对象。您可以使用通道的方法测试声音是否播放完毕get_busy()
。
一个简单的例子:
import pygame.mixer, pygame.time
mixer = pygame.mixer
mixer.init()
tada = mixer.Sound('tada.wav')
channel = tada.play()
while channel.get_busy():
pygame.time.wait(100) # ms
print "Playing..."
print "Finished."
这些示例假设您有一个名为“tada.wav”的声音文件。
您可以使用如下代码:
import pygame
pygame.mixer.music.load('your_sound_file.mid')
pygame.mixer.music.play(-1, 0.0)
while pygame.mixer.music.get_busy() == True:
continue
而且,它不必是 .mid 文件。它可以是 pygame 可以理解的任何文件类型。
要使用set_endevent,您必须执行以下操作:
# You can have several User Events, so make a separate Id for each one
END_MUSIC_EVENT = pygame.USEREVENT + 0 # ID for music Event
pygame.mixer.music.set_endevent(END_MUSIC_EVENT)
running = True
# Main loop
while running:
events = pygame.event.get()
if events:
for event in events:
...
if event.type == END_MUSIC_EVENT and event.code == 0:
print "Music ended"
...
pygame.mixer.pre_init(44100, 16, 2, 4096) # setup mixer to avoid sound lag
pygame.init()
startmusic="resources\snd\SGOpeningtheme.ogg"
pygame.mixer.set_num_channels(64) # set a large number of channels so all the game sounds will play WITHOUT stopping another
pygame.mixer.music.load(startmusic)
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1) # the music will loop endlessly
执行上述代码后,音乐将继续播放,直到您根据 pygame 站点信息停止或淡出为止。您可以循环播放您的心声,音乐将继续。如果您需要音乐播放两次,而不是 -1 放 1。然后音乐将播放一次并重复一次。您可以通过执行来检查流是否正在播放pygame.mixer.music.get_busy()
。如果它返回 True 它是。False 表示它已经完成。