2014年度辛星pygame教程1/742014年辛星Python之Pygame教程第一版说明:本教程编写于2014年6月,如果您在两年后看到本教程,那么可以丢弃它,因为肯定有更新的版本出现了。建议:百度或者谷歌“辛星pygame”可以找到更新更全的资料。另外:如果读者对游戏编程非常感兴趣,也可以联系我,因为我对游戏编程也非常感兴趣。Pygame编程,辛星与您同在。百度搜索“辛星python”或者“辛星pygame”,您会看到更多。2014年度辛星pygame教程2/74目录:第一部分:理论部分第零节:前言……………………………………………3第一节:认识Display…………………………………6第二节:使用图片………………………………………13第三节:图片的操作…………………………………22第四节:小项目第一个:会动的美女………………28第五节:字体与文字……………………………………31第六节:事件与鼠标键盘………………………………38第七节:小项目第二个:测试鼠标位置………………50第八节:声音和音乐……………………………………54第九节:sprite模块……………………………………65第十节:阶段性总结以及pygame的其他模块…………72第二部分:实际项目部分(估计2014年七月份左右再完成期待您的关注)2014年度辛星pygame教程3/74第零节:前言**************本教程***************************1.由于pygame的资料很多,但是大多数都浅尝辄止,基本就是教给大家怎么向界面上添加几张图片,怎么添加声音,完全不能够达到制作游戏的水平。2.本教程是我在看了官方的教程之后,加上自己的一些动手写了一些例子之后才给大家写的。3.到最后我会做出一个完整的游戏给大家,仔细分析一下做制作一个游戏的方方面面。****************pygame的历史***************1.提到pygame,不得不提一下SDL,即SimpleDirectmediaLibrary,翻译成汉语即简易直媒体库,由SamLantinga编写。2.SDL用C语言写成,目的是为了提供多媒体控制,它的目的是编写2D游戏。3.而说到Pygame,还不得不提一下PySDL,PySDL的作者是MarkBaker,它就是SDL在Python上的一个扩展,即可以用Python去操作PySDL,但是,Pygame的作者认为PySDL的不足之处就是必须用C语言的风格去使用它,而不是Python的风格。4.终于说到了Pygame,它的作者是PeteShinners,开始于2000年的夏天,第一个发布版本是在2000年的十月。************Pygame与SDL的比较**************1.确切来说,对于每一个对游戏感兴趣的人,并且同时学习过C与Python,我认为SDL库与Pygame,都是很推荐学习与使用的。2014年度辛星pygame教程4/742.我学习过SDL,感觉它具有C语言一贯的特点:严谨、啰嗦。与Pygame相比,确实很麻烦,这一点,大家可以两者都学习一下,然后进行对比。3.SDL是过程式的编程方式,Pygame则是面向对象的编程,使得后者更加方便一些。************Pygame的优点与缺点**************1.坦率的说,我不是Pygame的铁粉,但是它的优点还是蛮多的,首先就是简洁、面向对象、方便。2.关于运行效率,还是可以的,因为Pygame并不是用Python去写的,它的主要部分还是用C去写的,速度可以得到保证。3.Pygame用于编写2D游戏,运行速度比使用C++编写的同样的游戏,还是要慢一些,这也是它的为数不多的缺点。***************Pygame的内容*************1.随着学习的深入,我们会介绍Pygame的各个部分,现在大致说一下比较重要的几个把。2.它支持声音、图形、事件、变换、时间、游戏杆等2D游戏所需要的大多数内容。*************Pygame的下载与安装***************1.首先要安装Python,还要知道Python的版本号。2.下载可以去,找到对应版本的pygame,然后下载即可。3.如果你是windows平台,下载下来的应该是一个msi安装文件,直接双击安装即可。4.打开PythonShell,如果输入importpygame,如果没有报错,则说明安装成功。2014年度辛星pygame教程5/74************关于该库********************1.该库是免费使用的,不会因此引起商业纠纷。2.除了感谢我们的作者Pete之外,还感谢如下所有人:************关于3D游戏*****************1.很多人问我是否可以用Pygame去开发3D游戏,其实不是能不能的问题,而是Pygame并没有提供3D游戏需要的一些很关键的东西。这些东西还需要我们从零去做,这就是说明,用它和不用是一样的。2.我最近也发现了开发3D游戏的另外一个库:Panda3D,有时间可以去研究一下。***************基础************************1.本手册是需要Python语言的基础的,如果还不熟悉Python语言,可以去搜索“辛星Python”去学习一下。2.当然,其他的优秀的Python教程我也非常推荐。2014年度辛星pygame教程6/74第一节:认识Display*************第一个示例********************1.第一个示例非常简单,它就是显示一个600x480的窗口,然后把背景色变成绿色,然后设置标题为“Ilovexinxing”。2.代码截图:3.运行效果:2014年度辛星pygame教程7/74***************代码解读****************1.第一行是引入模块,即importsys,pygame,只有导入了pygame,才能使用里面的各种类与函数。2.第二行pygame.init()是初始化,它会初始化所有的东西,具体初始化哪些东西,我们后面会说。3.第三行设置了green的颜色,这里涉及到颜色的一些知识,颜色可以用rgb表示,当然,也有其他的表示方式,这里使用的是RGB。4.第五行是初始化一个窗口并且设置大小为600*480。5.第六行是把背景色刷成绿色。6.第七行是把标题设置为“Ilovexinxing”,第八行是刷新一下。2014年度辛星pygame教程8/747.第十行到最后是一个循环,它从事件队列中提取事件,如果遇到了退出事件,则会退出。****************Surface*************1.pygame官方给surface的定义是“pygameobjectforrepresentingimages”,即它是一个用来表现图片的pygame对象。2.而我们上面的pygame.display.set_mode函数会返回一个Surface实例,关于surface的操作,我们会有一节专门解释。**************display***************1.display模块的作用就是展示给我们的窗口,该模块包括几个函数。2.它的全部函数如下:3.其实我们可以参照后面的英文说明来了解该函数的作用。2014年度辛星pygame教程9/74************display模块的作用***************1.该模块提供了控制pgyame展示给我们看到的东西,pygame只有一个可以展示的surface,这个surface会充满我们的窗口。2.一旦我们用display创建了一个surface,我们可以把它当成一个普通的surface去操作,至于该surface能有什么操作,我们下一节会说明。3.对于surface的操作不会立即显示出来,我们必须采用其中一个刷新函数来刷新界面,总共有两个函数来刷新界面。4.它的坐标表示是左上角为0,0,向右和向下都是增加的。5.游戏界面初始化可以有几种方式,具体我们下面再说。6.在游戏的任何时刻,都只有一个surface是处于激活状态,最开始处于激活状态的是我们使用pygame.display.set_mode创建的那个,并且它会关闭之前的界面。7.只要显示界面一旦被创建,该模块的所有函数都是作用在这个surface上,因此不需要明确指定。**********该模块的重要函数****************1.pygame.display.init():它没有返回值,它用来初始化该模块,当我们使用pgyame.init()的时候,该模块已经被初始化了,所以,一般情况下不需要单独初始化。2.pygame.display.quit():它用来停止该模块。3.pygame.display.get_init():它返回一个bool类型的值,用来判断该模块是否被初始化。4.pygame.display.set_mode(resolution=(0,0),flags=0,depth=0):它返回一个surface,第一个参数指定的是创2014年度辛星pygame教程10/74建窗口的大小,第三个参数我们通常不用设置,第二个参数是可选的设置参数,我们可以不设置任何值,让它取默认值,也可以从以下选取:pygame.FULLSCREEN(使用全屏模式)pygame.RESIZABLE(可以改变窗口大小的模式)pygame.NOFRAME(无边框和按钮的模式)pygame.DOUBLEBUF(使用硬件加速并用OPENGL来渲染画面)pygame.HWSURFACE(硬件加速模式,只有在全屏下有效)pygame.OPENGL(使用OPENGL的渲染技术)。5.pygame.display.get_surface():返回值为一个Surface,即当前展示界面的surface。6.pygame.display.update():无返回值,它可以接受一个参数rectangle,也可以接受rectangle_list,即接受一堆小矩形来刷新,当我们需要刷新多个小矩形区域的时候,一次刷新多个矩形区域比多次调用它来刷新单个的矩形区域效率要高一些。如果不向它传递任何参数,则它会全部刷新。7.pygame.display.get_driver():返回驱动的名称,它往往与硬件加速有关。2014年度辛星pygame教程11/748.pygame.display.info():返回videoinfo,它返回当前的绘图环境,它的一些属性如下:9.pygame.display.get_wm_info():返回一个字典,它是在pygame1.7.1版本中添加的,大多数平台都会返回一个window对应的值。10.pygame.display.list_modes():返回一个列表,接受一个depth和flags,且默认取值为0和FULLSCREEN。11.pygame.display.mode_ok():它和pygame.display.set_mode接受相同的参数,如果该模式可以,则返回depth,即颜色深度,如果不可以,则返回0.12.pygame.display.get_active():返回类型为bool,如果它被最小化或者隐藏起来,即不是活动窗口,则返回False,如果是活动窗口,则返回True。13.pygame.display.iconify():返回类型为bool,即它是否可以被最小化和隐藏,注意,不是所有的平台都支持最小化。14.pygame.display.toggle_fullscreen():返回值为一个bool类型,它返回是否支持双击全屏,该函数只在Unixx11下有效。2014年度辛星pygame教程12/7415.pygame.display.set_icon():它接受一个Surface参数,它改