2011-12-10 66 views
4

我一直在试图让我的Android游戏中使用PyGame子集编写的音乐循环。这是我迄今为止所做的,它只播放一次音频文件。我真的很想使用内置的循环功能,这样我就不必使用定时器手动循环音频。有任何想法吗?如何在Android的PyGame子集中循环播放音乐?

import pygame 
try: 
    import pygame.mixer as mixer 
except ImportError: 
    import android_mixer as mixer 
if mixer: 
    mixer.music.load("woo.mp3") 
    mixer.music.play(-1) 
while True: 
    if mixer: 
     mixer.periodic() 

回答

0

也许试试这个,而不是music.load():

从文件

mixer.Sound(filename): return Sound 
Sound.play(-1) 
0

我相当肯定,问题可以得到解决创建一个新的Sound对象mixer.music.get_busy()返回一个布尔值,如果音乐正在播放,则为True;如果没有播放音乐,则为False。

import pygame 
try: 
    import pygame.mixer as mixer 
except ImportError: 
    import android_mixer as mixer 
if mixer: 
    mixer.music.load("woo.mp3") 
    mixer.music.play(-1) 
while True: 
    if mixer: 
     if mixer.music.get_busy() == False: 
      mixer.music.play() 
1

注意在Android 5.x中不起作用。我知道这是一个旧帖子,但我有一个也遇到了这个问题。 zenopython的答案会在调音台模块出现错误时进行一些调整。如果你看看anroid.mixer模块,看看你会看到的音乐课程。

@staticmethod 
def get_busy(): 
    return music_channel.get_volume() 

你可以看到这实际上调用了总是返回1.0的get_volume()。为了解决这个问题我复制了mixer.py文件到我的游戏目录,并把它改为

@staticmethod 
    def get_busy(): 
     return music_channel.get_busy() 

然后imoport混频器和它的作品。所以像

import pygame 
try: 
    import pygame.mixer as mixer 
except ImportError: 
    import mixer 
if mixer: 
    mixer.music.load("woo.mp3") 
    mixer.music.play(-1) 
while True: 
    if mixer: 
     if mixer.music.get_busy() == False: 
      mixer.music.play(-1) 

这对我有效。

如上所述,这不适用于5.x.

另一种解决方案是简单地排队音乐这确实工作

mixer.music.load('music') 
mixer.music.play() 
mixer.music.queue('music') 

一般的mixer.music模块中pgs4a有一些错误。我发现的另一个错误是在mixer.music.pause()和mixer.music.unpause()中。 unpause()只是再次调用pause(),所以我也必须编辑它以允许在游戏停止时暂停音乐。见下文

if android:               
    if android.check_pause(): 
     mixer.music.pause() 
     android.wait_for_resume() 
     mixer.music.unpause()