您好,欢迎访问三七文档
Pygame的历史Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名SimpleDirectMediaLayer,是一位叫做SamLantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉好人不长命啊……)更有效的工作,创造了这个东东。SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好。安装Pygame你可以从,选择合适你的操作系统和合适的版本,然后安装就可以了(什么,你连Python都没有?您可能是不适合看这个系列了,不过如果执意要学,很好!快去下载吧!)。一旦你安装好,你可以用下面的方法确认下有没有安装成功:Pythonimportpygameprintpygame.ver1.9.1release123importpygameprintpygame.ver1.9.1release你的版本可能和我不同,这没关系。我所翻译的这本书上的版本还是1.7.1的……所以如果有些过时的不合时宜的东西,千万不要客气请指出来!若说为什么要介绍这么一个“过时”的东西,真正的知识是不会过时的,只有技术才会。这里主要是依靠Pygame来介绍的游戏开发的方方面面,并不是说咱就可以靠这个做出什么伟大的游戏了(当然也不是说不可以)!另外说一下,就产品而言,Pygame更致力于2D游戏的开发,也就是说,你可以用Pygame写一个植物大战僵尸,但是写一个魔兽世界则相当困难……请不要做出鄙夷的目光,底层的东西永远是相通的,而且对于新手而言,从简单的2D入手才是正途。使用PygamePygame有很多的模块,下面是一张一览表:模块名功能pygame.cdrom访问光驱pygame.cursors加载光标pygame.display访问显示设备pygame.draw绘制形状、线和点pygame.event管理事件pygame.font使用字体pygame.image加载和存储图片pygame.joystick使用游戏手柄或者类似的东西pygame.key读取键盘按键pygame.mixer声音pygame.mouse鼠标pygame.movie播放视频pygame.music播放音频pygame.overlay访问高级视频叠加pygame就是我们在学的这个东西了……pygame.rect管理矩形区域pygame.sndarray操作声音数据模块名功能pygame.sprite操作移动图像pygame.surface管理图像和屏幕pygame.surfarray管理点阵图像数据pygame.time管理时间和帧信息pygame.transform缩放和移动图像有些模块可能在某些平台上不存在,你可以用None来测试一下。Python123ifpygame.fontisNone:printThefontmoduleisnotavailable!exit()新的HelloWorld学程序一开始我们总会写一个Helloworld程序,但那只是在屏幕上写了两个字,现在我们来点更帅的!写好以后会是这样的效果:Python123456789101112131415#!/usr/bin/envpythonbackground_image_filename='sushiplate.jpg'mouse_image_filename='fugu.png'#指定图像文件名称importpygame#导入pygame库frompygame.localsimport*#导入一些常用的函数和常量fromsysimportexit#向sys模块借一个exit函数用来退出程序pygame.init()#初始化pygame,为使用硬件做准备16171819202122232425262728293031323334353637383940414243444546screen=pygame.display.set_mode((640,480),0,32)#创建了一个窗口pygame.display.set_caption(Hello,World!)#设置窗口标题background=pygame.image.load(background_image_filename).convert()mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()#加载并转换图像whileTrue:#游戏主循环foreventinpygame.event.get():ifevent.type==QUIT:#接收到退出事件后退出程序exit()screen.blit(background,(0,0))#将背景图画上去x,y=pygame.mouse.get_pos()#获得鼠标位置x-=mouse_cursor.get_width()/2y-=mouse_cursor.get_height()/2#计算光标的左上角位置screen.blit(mouse_cursor,(x,y))#把光标画上去pygame.display.update()#刷新一下画面这个程序需要两张图片,你可以在这篇文章最后的地方找到下载地址,虽然你也可以随便找两张。为了达到最佳效果,背景的sushiplate.jpg应要有640×480的分辨率,而光标的fugu.png大约应为80×80,而且要有Alpha通道(如果你不知道这是什么,还是下载吧……)。注意:代码中的注释我使用的是中文,如果执行报错,可以直接删除。游戏中我已经为每一行写了注释,另外如果打算学习,强烈建议自己动手输入一遍而不是复制粘贴!稍微讲解一下比较重要的几个部分:set_mode会返回一个Surface对象,代表了在桌面上出现的那个窗口,三个参数第一个为元祖,代表分辨率(必须);第二个是一个标志位,具体意思见下表,如果不用什么特性,就指定0;第三个为色深。标志位功能FULLSCREEN创建一个全屏窗口DOUBLEBUF创建一个“双缓冲”窗口,建议在HWSURFACE或者OPENGL时使用HWSURFACE创建一个硬件加速的窗口,必须和FULLSCREEN同时使用OPENGL创建一个OPENGL渲染的窗口RESIZABLE创建一个可以改变大小的窗口NOFRAME创建一个没有边框的窗口convert函数是将图像数据都转化为Surface对象,每次加载完图像以后就应该做这件事件(事实上因为它太常用了,如果你不写pygame也会帮你做);convert_alpha相比convert,保留了Alpha通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。游戏的主循环是一个无限循环,直到用户跳出。在这个主循环里做的事情就是不停地画背景和更新光标位置,虽然背景是不动的,我们还是需要每次都画它,否则鼠标覆盖过的位置就不能恢复正常了。blit是个重要函数,第一个参数为一个Surface对象,第二个为左上角位置。画完以后一定记得用update更新一下,否则画面一片漆黑。这是一个最最大概的Pygame程序的印象,接下来我们会学习更多深层次的东西,并且把各条语句都真正读懂。用Python和Pygame写游戏-从入门到精通(2)本次使用的两张图片资源:背景:sushiplate.jpg光标:fugu.pngCategory:Python标签:pygame,Python,游戏开发用Python和Pygame写游戏-从入门到精通(2)Byxishui|2011/04/14139Comments上次我们试着写了一个最简单的Pygame程序并且解释了一个大概的框架,这次就Pygame中也是游戏中最关键(……好吧,也许并不是最关键,但绝对是至关重要的一项)的事件来展开。此图为一个用Pygame开发的游戏,或许有些简陋,但是只要你有爱,什么都能出来!理解事件事件是什么,其实从名称来看我们就能想到些什么,而且你所想到的基本就是事件的真正意思了。我们上一个程序,会一直运行下去,直到你关闭窗口而产生了一个QUIT事件,Pygame会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。事件随时可能发生,而且量也可能会很大,Pygame的做法是把一系列的事件存放一个队列里,逐个的处理。事件检索上个程序中,使用了pygame.event.get()来处理所有的事件,这好像打开大门让所有的人进入。如果我们使用pygame.event.wait(),Pygame就会等到发生一个事件才继续下去,就好像你在门的猫眼上盯着外面一样,来一个放一个……一般游戏中不太实用,因为游戏往往是需要动态运作的;而另外一个方法pygame.event.poll()就好一些,一旦调用,它会根据现在的情形返回一个真实的事件,或者一个“什么都没有”。下表是一个常用事件集:事件产生途径参数QUIT用户按下关闭按钮noneATIVEEVENTPygame被激活或者隐藏gain,stateKEYDOWN键盘被按下unicode,key,mod事件产生途径参数KEYUP键盘被放开key,modMOUSEMOTION鼠标移动pos,rel,buttonsMOUSEBUTTONDOWN鼠标按下pos,buttonMOUSEBUTTONUP鼠标放开pos,buttonJOYAXISMOTION游戏手柄(Joystickorpad)移动joy,axis,valueJOYBALLMOTION游戏球(Joyball)?移动joy,axis,valueJOYHATMOTION游戏手柄(Joystick)?移动joy,axis,valueJOYBUTTONDOWN游戏手柄按下joy,buttonJOYBUTTONUP游戏手柄放开joy,buttonVIDEORESIZEPygame窗口缩放size,w,hVIDEOEXPOSEPygame窗口部分公开(expose)?noneUSEREVENT触发了一个用户事件code如果你想把这个表现在就背下来,当然我不会阻止你,但实在不是个好主意,在实际的使用中,自然而然的就会记住。我们先来写一个可以把所有方法输出的程序,它的结果是这样的。我们这里使用了wait(),因为这个程序在有事件发生的时候动弹就可以了。还用了font模块来显示文字(后面会讲的),下面是源代码:Python1234567891011importpygamefrompygame.localsimport*fromsysimportexitpygame.init()SCREEN_SIZE=(640,480)screen=pygame.display.set_mode(SCREEN_SIZE,0,32)font=pygame.font.SysFont(arial,16);font_height=font.get_linesize()event_text=[]1213141516171819202122232425262728293031323334whileTrue:event=pygame.event.wait()event_text.append(str(event))#获得时间的名称event_text=event_text[-SCREEN_SIZE[1]/font_height:]#这个切片操作保证了event_text里面只保留一个屏幕的文字ifevent.type==QUIT:exit()screen.fill((255,255,255))y=SCREEN_SIZE[1]-font_height#找一个合适的起笔位置,最下面开始但是要留一行的空fortextinreversed(event_text):screen.blit(f
本文标题:Pygame
链接地址:https://www.777doc.com/doc-7289206 .html