首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以在Pygame中播放声音,同时做其他事情吗?

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

Stack Overflow用户
提问于 2019-04-28 00:30:46
回答 1查看 295关注 0票数 1

我正在用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方法播放声音,同时执行其他操作,但实际发生的情况是,一切都冻结了,播放声音,然后一切都恢复了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55882604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档