用Python和Pygame写游戏-从入门到精通(22)

By | 2011/08/26

辛苦啦~ 这次是我们系统的pygame理论学习的最后一章了,把这次的音乐播放讲完了,pygame的基础知识就全部OK了。不过作为完整的教程,只有理论讲解太过枯燥了,我随后还会加一个或更多的实践篇系列,看需要可能也会追加真3D等额外的内容。

就像上次所说的,pygame.mixer并不适合播放长时间的音乐播放,我们要使用pygame.mixer.music。

pygame.mixer.music用来播放MP3和OGG音乐文件,不过MP3并不是所有的系统都支持(Linux默认就不支持MP3播放),所以最好还是都用Ogg文件,我们可以很容易把MP3转换为Ogg文件,自己搜一下吧。

我们使用pygame.mixer.music.load()来加载一个文件,然后使用pygame.mixer.music.play()来播放,这里并没有一个类似Music这样的类和对象,因为背景音乐一般般只要有一个在播放就好了不是么~不放的时候就用stop()方法来停止就好了,当然很自然有类似录影机上的pause()和unpause()方法。

音效和音乐方法总结

Sound对象

方法名 作用
fadeout 淡出声音,可接受一个数字(毫秒)作为淡出时间
get_length 获得声音文件长度,以秒计
get_num_channels 声音要播放多少次
get_volume 获取音量(0.0 ~ 1.0)
play 开始播放,返回一个Channel对象,失败则返回None
set_volume 设置音量
stop 立刻停止播放

Channels对象

方法名 作用
fadeout 类似
get_busy 如果正在播放,返回true
get_endevent 获取播放完毕时要做的event,没有则为None
get_queue 获取队列中的声音,没有则为None
get_volume 类似
pause 暂停播放
play 类似
queue 将一个Sound对象加入队列,在当前声音播放完毕后播放
set_endevent 设置播放完毕时要做的event
set_volume 类似
stop 立刻停止播放
unpause 继续播放

Music对象:

方法名 作用
fadeout 类似
get_endevent 类似
get_volume 类似
load 加载一个音乐文件
pause 类似
play 类似
rewind 从头开始重新播放
set_endevent 类似
set_volume 类似
stop 立刻停止播放
unpause 继续播放
get_pos 获得当前播放的位置,毫秒计

虽然很简单,不过还是提供一个例程吧,这里面音乐的播放很简单,就是上面讲过的,不过其中还有一点其他的东西,希望大家学习一下pygame中按钮的实现方法。

界面如上,运行的时候,脚本读取./MUSIC下所有的OGG和MP3文件(如果你不是Windows,可能要去掉MP3的判断),显示的也很简单,几个控制按钮,下面显示当前歌名(显示中文总是不那么方便的,如果你运行失败,请具体参考代码内的注释自己修改):

这个程序虽然可以运行,还是很简陋,有兴趣的可以改改,比如显示播放时间/总长度,甚至更厉害一点,鼠标移动到按钮上班,按钮会产生一点变化等等,我们现在已经什么都学过了,唯一欠缺的就是实践而已!

所以下一次,我将开始一个实战篇,用pygame书写一个真正可以玩的游戏,敬请期待~~

>> 用Python和Pygame写游戏-从入门到精通(目录)

本次使用的几个图像文件打包下载(也可以自己找更帅的)。


有25人评论 用Python和Pygame写游戏-从入门到精通(22)

  1. Clover

    – 列表里面有两个Sound Object,第二个应该是Music Object

    回复
  2. 1111

    那些表格:
    方法名 左右

    是”作用“,错别字

    回复
  3. abcd1234

    如果是中文名字的音乐文件会出现这个
    pygame.mixer.music.load( music_filenames[current_track] )
    error: MPEG file does not have any audio stream.
    不明白什么意思,用的windows

    回复
    1. xishui 作者

      这个应该和pygame没关系,请确认您读取的音乐文件有没有什么特别的,换一些试试?

      回复
  4. 浮游

    不能打开中文名字的歌曲

    pygame.mixer.music.load( music_filenames[current_track] )
    pygame.error: Couldn’t open ‘D:MUSIC怎么了.mp3’

    回复
  5. criss

    请问博主,有什么方法可以获取music对象的length?
    貌似把MP3文件加载为sound对象,然后用get_length获取的长度不太对。
    真心求教

    回复
    1. xishui 作者

      能提供的答案可能无法让您满意,据我所知,pygame没有这个能力,您也许应该使用其他的库来做,例如pymad等。。个人意见,我想以后您一定能发现更好的方法!

      回复
  6. JBSang

    亲爱的博主,为什么我的“飞鼠溪”的歌名字叫“BGM.mp3”,导入后播放,就发出了“嘟嘟嘟嘟嘟”的声音,不能正常播放。BTW,永久循环播放代码是啥?

    回复
    1. xishui 作者

      亲爱的JBSang,上面显示的名字是文件名,再加上它的声音是“嘟嘟嘟”,我相当怀疑您播放的文件和您想要播放的文件恐怕不是同一个……至于永久循环播放,很明显,您应该在“TRACK_END”那里做一下处理就OK了~~

      回复
    2. 白胡子老王

      你确定不是用的紫霞的宝剑发出的声音?

      回复
  7. JBSang

    博主有qq么?可以让我们这些小白加好友么?

    回复
  8. RichardRui

    博主你好,请问:pygame.mixer.music.load(music_filenames[current_track])
    error: MPEG file does not have any audio stream.
    是什么情况

    回复
  9. yellow

    这个例子是不是会经常内存溢出?我运行几次 都很容易崩溃 请博主说明一下是不是的呢?

    回复
  10. 孟雨

    我的是win8系统,最后运行不成功,
    Traceback (most recent call last):
    File “D:\0831\musicplay.py”, line 183, in
    run()
    File “D:\0831\musicplay.py”, line 92, in run
    pygame.mixer.music.load( music_filenames[current_track] )
    error: Couldn’t open ‘D:\KuGou\李宗盛 – 鬼迷心窍.mp3’
    求助

    回复
    1. xishui 作者

      先试试纯英文名,再试试ogg文件而不是mp3,还不行的话?

      回复
      1. 孟雨

        英文名mp3文件可以,但是中文名还是不可以
        Track: guimixinqiao.mp3
        Track: meilibennvren.mp3
        Track: zanmenjiehunba.mp3
        Track: 李宗盛 – 鬼迷心窍.mp3
        Track: 李玟 – 美丽笨女人.mp3
        Track: 云菲菲、冷漠 – 这条街.mp3
        Track: 咱们结婚吧.mp3
        Track: 侃侃 – 滴答.mp3
        play pressed
        next pressed
        next pressed
        next pressed

        Traceback (most recent call last):
        File “D:\0831\musicplay.py”, line 180, in
        run()
        File “D:\0831\musicplay.py”, line 124, in run
        pygame.mixer.music.load( music_filenames[current_track])
        error: Couldn’t open ‘D:\KuGou\李宗盛 – 鬼迷心窍.mp3’

        回复
    1. Sam100

      在内部把它的名字改成英文再播放不就行了嘛。

      回复
  11. Pingback: 用Python和Pygame写游戏-从入门到精通(22) | 演道网

发表评论

电子邮件地址不会被公开。 必填项已用*标注