随后,因为我们的消息循环中肯定还可能嵌套循环,一个break语句只能打破内部的循环,并不能让外部循环也退出,所以我们定义了一个bool的变量,来表示程序是否需要退出循环。
这里的消息循环从技术上并没有啥难度,主要是你需要适应这么多新的函数和预定义的变量(这里当然当做常量来用,比如表示pygame需要退出)。
在内部循环中,我们判断了三种可能需要退出的消息。一是自己定义的,如果音乐播放结束,应当退出;二是用户用鼠标关闭窗口,程序应当退出;三是按q键表示用户希望退出播放。
按下按键游戏采取相应动作是很常见的游戏处理工作,我们在这里等待用户按下按键然后再松开的这一刻退出,这样防止用户按下q键一直没有松手所导致的程序退出后,屏幕上还会出现很多q字符的情况。
现在的程序已经能正常的播放音乐了,实际上我们的程序还能进一步优化。比如1.添加播放的时间显示;2.向前向后跳转播放。
这两个功能都可以在消息循环中处理,这样程序才是并行的。现在你可能感觉到了,实际上消息循环中,才是程序的主要逻辑。的确如此,其实所有的游戏基本都是在消息循环中做所有的主要工作,当然具体工作细节,都是由已经定义好的函数或叫子程序来具体执行完成的,在主循环中,只是对这些函数的组织、管理和调用。
显示播放位置:#程序主循环
while not requireQuit:
#获取当前播放位置
pos=pygame.mixer.music.get_pos()
#显示
print("Playing:", pos,end='\r')
消息循环中,在按键部分添加代码: #如果是向右键,则前跳10秒
elif event.key == pygame.K_LEFT:
pygame.mixer.music.set_pos(pos/1000-10)
#如果是向左键,则后跳10秒
elif event.key == pygame.K_RIGHT:
pygame.mixer.music.set_pos(pos/1000+10)
这样的功能增加,依赖于你对pygame扩展库越来越熟悉,通过阅读文档,发现pygame扩展库能提供什么样的功能。而这个功能你又需要,就可以加入到程序中。
练习时间
其实本讲可以说从开始到现在都是挑战,因此没有再设置单独的挑战环节。
我们直接进入练习的环节:
以本讲前面最终版代码code5.py为蓝本,修改程序,实现由命令行参数接受mp3文件名,并播放
除了q键之外,请设定ESC键也作为退出按键。提示,ESC键的代码为:pygame.K_ESCAPE
本讲小结
python并不是很适合进行游戏编程,但游戏编程的学习能让你的程序更友好,并具有丰富的表现力
并行、事件驱动的编程思想,是现代程序开发的前沿思想,对于提高程序的效率和稳定性有重要的帮助
在一个新模块的学习中,循序渐进,逐步完善代码是常用的一种手段。在本讲,我们更侧重讲述,你接触到一个新的扩展包,如何查找资料、分析问题,最终掌握它的使用