【问题标题】:Can I play sound in Pygame and do other stuff simultaneously?我可以在 Pygame 中播放声音并同时做其他事情吗?
【发布时间】:2019-04-27 16:30:45
【问题描述】:

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

【问题讨论】:

  • 我猜你不应该通过exec 调用它。顺便说一句,你为什么这样做?
  • 我使用 exec 是因为我认为在代码运行时创建变量会更容易。我是一个菜鸟程序员,所以我不太了解它。它可以很好地创建变量。我不认为 exec 是问题所在。即使我手动创建变量,也会出现同样的问题。
  • 实际上我从来没有在 pygame 中使用过声音,所以我现在出于好奇正在尝试。但我从未见过它通过exec 调用,所以我认为这就是问题所在。

标签: python pygame


【解决方案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)

【讨论】:

  • 谢谢!这对我来说是一个巨大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多