<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML'></script>html
一般来讲,Python解释执行,运行速度慢,并不适合完整的开发游戏。随着电脑速度的快速提升,这种状况有所好转,但开发游戏仍然不是Python的重点工做。
大多应用是利用Python开发效率高的特色,进行游戏原型验证,或者在大的游戏系统中,使用Python进行地图、场景等定制。还有就是使用游戏开发的技术和理念,将Python用于商业视觉展现、工程效果展现。python
原型验证:指的是有了一个好的游戏想法,完整的开发出来确定须要大量的人员、费用、时间,利用Python编程简单高效的特色,先模拟完成一部分游戏的功能,从而可以展现给投资人、客户,获取你们的承认,进而获得经费投入。
地图、场景定制:游戏的开发确定须要不少专业技术方面的高精尖人才,但游戏的运营、地图的设计、故事情节等。这都是商业或者艺术方面的专业强项,而这些人员不大可能使用c/c++等经常使用的游戏开发工具来作这些工做。所以,游戏开发过程当中,一般完成Python语言的接口,让这些商业、艺术工做人员也能使用比较方便的手段进行游戏功能的调整。c++
此外,现代的游戏开发已是一个大团队合做的产物,已经很是难以单打独斗完成一款游戏。因此学习游戏编程的目标并非但愿本身独立完成一个游戏,而是用这种思路来解决具体问题。
一般游戏开发的工做分工是这样的:
其中音效、画面都会由更专业的团队完成。最后由程序人员集成在游戏中。在游戏中,音乐音效、操做控制、游戏逻辑、画面几个部分,都是并行在同时进行的。它们必须共同生效,游戏才会好玩。ajax
Pygame是一个强大的游戏扩展包,首先也是安装:编程
#使用管理员模式启动cmd命令行,而后执行: pip install pygame #某些系统是pip3 install pygame
这个安装扩展包的过程,咱们重复了不少遍,这个算是最后一遍了。由于Pygame是咱们课程讲解的最后一个扩展包。比起来其它的软件,Python的扩展包,只要你知道了名字,安装几乎都是相同的。即使不一样的操做系统,差异也不大。flask
在这一讲,咱们会采用跟之前不一样的方法来说述Pygame扩展包的使用。缘由是Python有很是多的扩展包。即使官方内置的扩展包,也量很是大。若是彻底等待别人教你使用这种方式是不可能的,此外即使是别人教过了,Python和扩展包的升级也很是的快。原有的使用方法,极可能如今已经不适用了。这些都要求你有本身探索的能力,在Python基本技能的学习掌握以后,根据本身的编程需求,选择相应的扩展包,查找资料、文档。在网上资料的帮助下,掌握扩展包的使用方法。网络
从目前行业内的使用状况看,最大的障碍在于目前主要的文档来源都是英文的,这要求咱们具有必定的英文阅读能力。此外,虽然版本的更新对扩展包的使用有一些差异,但这种差异毕竟不算大。因此在国内一些相对较早的文档帮助下,再对应国外新版本的文档,也能下降你的学习门槛。架构
只是播放mp3,Python有不少扩展包能够选,不少操做起来也更简便。不过pygame是为了游戏设计,除了背景音乐,音效、与画面的协做也考虑的更多。因此虽然用起来复杂一些,咱们依然仍是选择学习用Pygame播放mp3音乐。目的,更可能是指望学习者除了学习python相关的知识,也更多理解现代计算机并发多任务和多种约束条件下的编程思惟。并发
拿到一个新的扩展包,一般你有这样几种途径了解它的使用:框架
到官网查看官方文档(一般是英文)
在搜索引擎网站好比百度搜索中文的资料,这种状况比较多见,由于大多状况下,你之因此知道这个扩展包,也是在网上搜索相关资料的时候,别人介绍的。而一般这种状况下,都已经有包简单实用的介绍。
使用Python内置的dir()/help()函数,当前仍是英文资料,适合已经了解扩展包的基本架构,只是在函数选择、调用的时候查找资料
因此,实际上,经过搜索引擎查找相关资料,应当是你上手的最优选择。以pygame为例,经过查找中文的资料,总结以后,应当能写出这样的程序:
#MP3播放器 #引入扩展库 import pygame #歌曲文件 file='rongHua.mp3' #初始化声音库 pygame.mixer.init(frequency=44100) print("播放音乐-绒花") #载入音乐文件 pygame.mixer.music.load(file) #播放声音 pygame.mixer.music.play()
程序每一条语句都有注释,大概的框架上看,应当也是顺序执行的。有一些参数可能你还不能明白,好比frequency=44100
,不过应当不影响你抄过来用。这个是指定音频库使用的采样频率,44100通常已是高保真音乐的采样频率了。一般mp3文件都是这种格式。另外忘了交代,rongHua.mp3是咱们要播放的声音文件名称,记得要提早准备好,放到程序同一个目录。
执行程序以后发现,诡异的事情发生了,程序只显示了一行文字:“播放音乐-绒花”,而后就退出了,并无事情发生,也没有音乐播放出来。
一开始就说过了,本讲重点不彻底是播放一首音乐,而是但愿能引导你们使用探索的方式,来了解一个新的扩展包如何学习和使用。因此不要等待着我说出答案,而是积极的思考,判断出现了什么问题,而且尝试去解决。
首先要说明的是,程序自己引入pygame库、库的初始化还有播放语句语句自己都并无什么错误。一般在网上查找资料的时候,只要认真阅读,比较容易保证这一点。难以立刻学会并应用到编程中的,是关于某个库“架构”方面的内容,也就是影响程序结构方面的内容。若是以为这句话比较抽象的话,你能够回忆一下上一讲咱们尝试过的flask网络编程框架。框架、架构,这两个词在这里基本能够划等号了。
咱们的程序没有能播放出来音乐,也是这方面的缘由。
一般游戏程序要包含至少4部分的内容,咱们用本讲开始的那张图来讲明,音乐、画面、操控、逻辑这四部份内容是并行运行,相互配合,才能展示给用户一个图文并茂、流畅、吸引人的游戏。
所以做为游戏的一部分,音乐的播放也不可能像咱们前面学过的绘图、计算等操做同样,在音乐没有播放完成前,程序中止在那里一直等待。事实上一般游戏的作法都是,发出播放音乐的命令以后,命令自己立刻返回,让程序有能力并行去处理按键输入、绘图等动做。
而在咱们上面的程序中,播放这个命令确定是发出去了,但没有等音乐声响起,程序就已经结束退出了。程序的结束退出将自动的释放程序打开的各项资源,清理运行的痕迹,从而音乐也就不可能再放出来了。
这仅仅是咱们推测分析的结果,咱们来证实一下,方法就是在程序最后增长一行语句:
#程序等待5秒钟 pygame.time.delay(1000*5)
使用这样语句的目的是,若是咱们上面的推测成立,那确定要对程序作结构上的调整。这个工做量会比较大,因此咱们先使用简单的语句来验证一下咱们的思考。
再次运行程序,你会听到音乐响了5秒钟,而后程序退出,音乐也中止了。
这基本能够证实,咱们的思考正确。此外彷佛还有些别的问题,好比音乐一开始有一个“破音”,这让人感受很差。并且程序彷佛有的时候能正常播放,有的时候仍是不稳定,没法播放成功。
下面要如何改进程序呢?
一般咱们会继续在网上搜索pygame模块使用的案例,阅读别人的程序,有的时候运气好,你碰到的程序代码,跟你想写的代码是彻底相同的功能,这时候你能够拷贝过来直接使用。但大多时候,你只能找到功能相近的代码,因此仍然须要你阅读别人的程序,并从其中学习对你有用的部分。
好比,你可能搜索到咱们第一讲演示的游戏,其中固然也有声音处理的部分,你会重点阅读这部分的代码,来找出同本身程序的区别,以求解决问题。
在这个过程当中,咱们又作出了一些判断,固然这些判断依然须要大量程序的经验,因此并不能要求初学者也能轻易作到。但复杂的作不到,你能够从简单的入手,逐渐积累。这里只是想告诉你正确的学习思路:
验证思考最好的办法就是修改程序,而后再次运行实验,所以咱们再完成一版程序:
#引入扩展库 import pygame #歌曲文件 file='rongHua.mp3' #初始化pygame显示库 pygame.display.init() #打开一个窗口 screen = pygame.display.set_mode([200,100]) #初始化pygame声音库 pygame.mixer.init(frequency=44100) print("播放音乐-绒花") #载入音乐文件 pygame.mixer.music.load(file) #保存当前音量 v = pygame.mixer.music.get_volume() #设置为静音,防止开始的爆破音 pygame.mixer.music.set_volume(0) #播放声音 pygame.mixer.music.play() #延时0.2秒打开声音,避过爆破音 pygame.time.delay(200) pygame.mixer.music.set_volume(v) #播放5秒钟 pygame.time.delay(1000*5) #中止播放 pygame.mixer.music.stop() #退出声音库和显示库 pygame.mixer.quit() pygame.display.quit()
每一行代码都有注释,我只讲解跟上一版不一样的代码:
此外这些工做中,用到了不少新的函数,这些函数一开始你并不可能知道。这些函数的学习通常是两个方向,一是概要的浏览pygame的手册或者帮助,在心中有一个粗的概念,这样用到什么功能的时候,你会想起来可能有某个函数能完成这个功能,而后再精细查看。第二是但愿用到某个功能,在网上查找使用Python或者pygame如何作到这个功能。固然还有另一种渠道,有可能你直接搜索到了功能相近的代码,从中间直接抄过来使用。
试运行以后咱们开心的发现,稳定性问题和爆破音都解决了,剩下最关键的,如何完整的播放音乐文件?
这涉及到了咱们前面讲过的程序结构问题,也是一个框架型的程序库对程序结构的要求。这一部分通常没有好办法,只能经过阅读官方的文档或者阅读其它程序的成熟代码来获取,这个过程通常会较长。好在咱们大多状况下不会上来就碰到这么复杂的问题,都是按部就班。而且大多的扩展包只是增长功能性的函数,并不要求程序的结构有多少改变。
咱们经过一张对比图来讲明pygame对程序结构的要求:
传统程序虽然咱们不怎么熟悉声音处理,但结构咱们都比较熟悉。程序中可能有循环,但整体是串行执行的,完成一件事情,才去作另一件。
从外观上看,右侧的游戏程序结构,跟左侧不过多了一个循环。但你要记得,这里面每一项都是并行执行的,每个步骤并不会等待这一项工做作完,就会返回接受新的命令,因此程序的声音、图像、程序逻辑、键盘控制,才可能一块儿发生做用。
这种并行处理的程序,同传统的程序比,有不少不可协调的理念区别,pygame为了作到并行,采用了“事件驱动”的理念来完成这种控制。
事件驱动实际是存在好久的编程方式了,通常传统的Windows程序,都使用微软公司提供的消息循环,来处理全部的窗口事件。Python pygame的事件处理,也是采用相似的机制。
总结一下使用事件驱动的方式来编写pygame程序的要点:
咱们根据刚才这些理念,从新改写程序,这个程序最终造成code4.py,这里只介绍重点的消息循环部分:
#... 初始化及基本播放代码忽略... #自定义一条消息(一个事件)用于表示播放结束 #pygame.USEREVENT是pygame中预约义的用户消息起始值 MUSIC_END = pygame.USEREVENT + 1 #设置当前音乐播放完成后,发送自定义的消息 pygame.mixer.music.set_endevent(MUSIC_END) #延时0.2秒打开声音,避过爆破音 pygame.time.delay(200) pygame.mixer.music.set_volume(v) #定义一个退出程序标志 requireQuit = False #程序主循环 while not requireQuit: #循环接受各类事件 for event in pygame.event.get(): #若是是自定义的播放完成消息 if event.type == MUSIC_END: requireQuit=True #退出 break #界面窗口菜单关闭申请 elif event.type == pygame.QUIT: requireQuit=True break #有键盘抬起 elif event.type == pygame.KEYUP: #q键 if event.key == pygame.K_q: requireQuit=True break #... 退出操做 ...
程序中,咱们本身定义了一条消息。所谓消息,并非日常人类喜闻乐见的一条短信或者语音,其实就是一个整数数字。为了容易记忆,咱们固然本身定义了一个变量名来表明它,但实际它就是一个数字。
缘由是对计算机来说,其实一切都是数字,咱们用一个字符串反而让计算机执行的更慢。
随后,由于咱们的消息循环中确定还可能嵌套循环,一个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扩展库能提供什么样的功能。而这个功能你又须要,就能够加入到程序中。
其实本讲能够说从开始到如今都是挑战,所以没有再设置单独的挑战环节。
咱们直接进入练习的环节:
请参考mp3Player.py程序。
(全部本系列中出现、使用过的源码将会在连载完成后统一整理提供下载。)
原文出处:https://www.cnblogs.com/andrewwang/p/10208319.html