我可以在Pygame中播放声音并同时做其他事情吗?

时间:2019-04-27 16:30:46

标签: python pygame

我在python和pygame中制作了一个小小的幻想控制台,但我偶然发现了一个问题。我当时正在制作一个音乐编辑器,可以进行芯片音乐调,但是当我使用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方法播放声音并同时执行其他操作,但是实际上发生的是,所有内容冻结,播放声音,然后所有内容恢复。

1 个答案:

答案 0 :(得分:1)

声音将在其他线程中播放,并且不会停止执行。但是,您的循环包含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)
相关问题