【问题标题】:Any way I can get Python sounds to overlap?有什么方法可以让 Python 声音重叠吗?
【发布时间】:2016-12-21 22:42:37
【问题描述】:
import pygame,sys

pygame.init()

size = 40,40
screen = pygame.display.set_mode(size)

LEFT = 1

s = pygame.mixer.Sound("Sound.wav")

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == LEFT:
                s.play()

所以目前,我正在尝试使用 Pygame 制作游戏。我已经设置好了,所以只要你点击鼠标就会播放声音。它确实有效,但我真的很生气,因为我一次只能听到一种声音效果。如果我很快点击 7 次,我可能只听到 4-6 个声音。如果我很快点击 2 次,我只会听到一个声音播放。

我查看了有关重叠 Pygame 声音的各种其他问题(它与 pygame.mixer.Channel 有关,我不明白)。到目前为止,没有什么对我有用。有什么想法吗?

【问题讨论】:

    标签: python audio pygame


    【解决方案1】:

    旧线程,但像我这样的人可能正在努力解决同样的问题

    为了使 CodeSurgeons 解决方案发挥作用,我必须使用较小的缓冲区大小初始化 pygame.mixer

    pygame.mixer.init(buffer=2048)
    

    pygame.mixer.pre_init(buffer=2048)
    pygame.init()
    

    【讨论】:

    • 我遇到了类似的问题:我以大约 0.25 秒的间隔在 pygame.mixer.find_channel() 返回的空通道上反复发出 play() 调用。我想在每个通话中播放的声音只有大约 0.1 秒长。无论如何,声音并不是一直以 0.25 秒的间隔播放。相反,有时两种声音一个接一个地来得更快。当我将缓冲区大小初始化为 1024 时,一切都很好,但我必须使用 pre_init() 调用才能使其生效。
    【解决方案2】:

    玩了一下,我认为您使用pygame.mixer.Channel 是对的。我建议您查看pygame.mixerpygame.mixer.Channel 页面。我能想到的最简单的方法是查看 pygame 中是否有可用的空通道(默认情况下有 8 个通道可用,可以使用pygame.mixer.set_num_channels() 创建更多通道)。如果有一个空的可用,那么您可以使用通道而不是声音对象本身来播放声音。通过这两个调整,您的示例变为:

    import pygame
    import sys
    
    pygame.init()
    size = (200, 200)
    screen = pygame.display.set_mode(size)
    LEFT = 1
    s = pygame.mixer.Sound("Sound.wav")
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == LEFT:
                    print "click"
                    empty_channel = pygame.mixer.find_channel()
                    empty_channel.play(s)
    

    如果有帮助请告诉我!

    【讨论】:

    • 我应用它时似乎没有任何区别。我仍然遇到同样的声音比点击次数少的问题。我想我会暂时保留它。不过,感谢您的回复。
    • @ShawnSong 您是否尝试过使用更长的测试声音来更好地听到重叠?此外,我确实发现,如果我在应用程序最初加载时立即开始快速点击,它最终会丢失声音,所以在等待几秒钟后快速点击时看看是否有任何变化。此外,检查pygame.mixer.get_num_channels() 以查看默认情况下是否确实为 8 可能没有什么坏处。
    • 可能是我正在使用的版本(Python 3.3)?我已经看到 pygame.mixer.find_channel() 在网上为其他人工作,但对我来说,这没有什么区别。 pygame.mixer.get_num_channels() 返回 8;我已经试过了。
    • 无论我使用什么音效,或者程序启动后等待多长时间,或者我使用 pygame.mixer.set_num_channels() 设置 Pygame 有多少通道,声音似乎总是有他们可以玩多快的限制。如果一切都失败了,我可能会从我的游戏中删除声音。
    • @ShawnSong 我不认为版本有什么不同,因为我刚刚在 python 3.5 的解决方案中测试了代码,它工作得很好(当然是修改 print 语句!)。你在哪个平台?我在 Windows 10 64 位上运行我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多