我正在用python和pygame做一个小小的幻想控制台,我偶然发现了一个问题。我正在制作一个可以制作chiptune曲调的音乐编辑器,但当我使用pygame.mixer.Sound方法播放它们时,它会暂停一切并播放声音。例如,如果我在每次英雄拿起东西的时候播放一个声音,所有的东西都会冻结,它会播放这个声音,然后一切都会恢复。这在一开始并不是什么大问题,但它使得做背景音乐之类的事情变得不可能。有没有可能解决这个问题?
我尝试过使用playsound库,但这也冻结了一切。
def music(notes):
note_list = ["c","c2","d","d2","e","e2","f","f2","g","g2","a","a2"]
for i in note_list:
exec("{} = pygame.mixer.Sound('res/sounds/{}.wav')".format(i,i))
for i in notes:
for j in i:
exec("pygame.mixer.Sound.play({})".format(j))
time.sleep(.2)
我希望程序能够使用pygame.mixer.Sound方法播放声音,同时执行其他操作,但实际发生的情况是,一切都冻结了,播放声音,然后一切都恢复了。
发布于 2019-04-28 01:09:14
声音将在不同的线程中播放,并且不会停止执行。但是,您的循环包含time.sleep(.2)
,将停止执行0.2
秒。你对每个音符都这样做,这意味着如果你有一个有10个音符的曲子,它会让你的程序暂停2秒。
对于您的特定问题,有许多不同的解决方案,这都取决于您如何构造调用此函数的代码。一种解决方案可能是安排事件,然后在它们出现在事件队列中时播放它们。另一种是在应该播放单独的声音时调用它们。两者都需要一个游戏循环,我怀疑您是否有,因为您正在创建一个控制台游戏。
我会走简单的路线,将声音组合到你真正想要播放的联合声音中,而不是连续播放许多不同的声音。您可以使用一些程序,如Audacity编辑声音文件。然后,你甚至不需要一个函数。您只需调用pygame.mixer.Sound.play(zelda_pickup_tune)
,一切都将不停顿地工作(假设zelda_pickup_tune
是一个保存有效Sound
对象的变量)。
另外,不要使用exec
。如果你允许其他人使用你的代码,这会很慢,而且可能会有潜在的安全风险(目前你并没有确切地使用你的代码,但如果你以后做了一些小的改变,就很容易发生这种情况)。这也有点“神奇”,而且不可能用其他语言重写这段代码。
对于这样的问题,我建议使用一种更标准的方法,并使用字典。
def music(notes):
note_list = ["c","c2","d","d2","e","e2","f","f2","g","g2","a","a2"]
sounds = {} # Empty dictionary
for i in note_list:
sounds[i] = pygame.mixer.Sound('res/sounds/{}.wav'.format(i)) # Add note i as key and the sound as value.
for i in notes:
for j in i:
sounds[j].play() # Look up the sound with key i and play the sound.
time.sleep(.2)
https://stackoverflow.com/questions/55882604
复制相似问题