python中的pygame使用教程,pygame 入门
【简介】Pygame是python用来开发视频游戏的游戏引擎。底层主要由SDL库实现,是目前利用python开发小游戏的高性能游戏框架。
首先,安装pygame,使用pip下载并安装
安装PyGame II。入门案例详细分析1。示例效果
2.示例代码导入osimport pygame #标识是否退出循环exitFlag=False#设置屏幕刷新的帧率,即1s内刷新多少次1s=10 #初始化pygame游戏引擎pygame.init()#指定窗口的坐标(x,y),默认屏幕中心OS。Environ [SDL _视频_窗口_位置]=% d,% d% (0,25) #设置窗口大小surface=py game . display . Set _ mode((800,00)) #设置窗口标题py game . display . Set _ caption( py game教程)# Set icon ion=py game . image . load( e:\ as-workspace \ py game test \ drawable \ icon . png )。convert _ alpha()py game . display . set _ icon(icon)# Load本地图片BG surface=py game . image . Load( e:\ as-workspace \ pygamost \ drawable \ BG . jpg )。convert()#获取游戏时钟clock=pygame.time.Clock()#图片缩放scale img=py game . transform . scale(icon,(400,40)) #矩形框rect=scaleImg.get_rect()#移动步长step=10#绘制背景surface.blit(bgSurface,(0,0)) #刷新帧率newrect=none而不退出flag: clock.tick (fps) #重绘背景的指定区域,相当于擦除图片效果ifrect: surface.blit (bgsurface,blit 或者如果事件栈已满,会为pygame.event.get()中的event卡住:#单击关闭if event . type==py game . quit:exit flag=true #向屏幕画布的指定区域绘制一幅图片,surface.blit(scaleImg,NewRect) #控制移动if new rect . x800-new rect . w:step=-10 e lif new rect . x0:step=10 # Update在屏幕上绘制pygame.display.update([rect,Newrect]) 为了达到这个目的,一个循环体需要保持运行,所以需要一个全局变量来标识是否退出循环,结束进程,例如:exitFlag如上所述。
2)游戏界面变化的频率对应的是画面刷新的帧率,即每秒刷新多少次画面。这个刷新帧率设置的太快了,如果设备的GPU跟不上刷新就无效了。所以一般设置为每秒刷新30次,以达到观看视频的流畅效果。比如上面的代码设置FPS=10是为了防止刷新过快,否则动画会移动过快,画面看不清楚。其中Pygame clock是控制游戏画面刷新的帧率。通过clock=pygame.time.Clock()获取时钟对象,然后在循环中设置指定的帧率:clock.tick(FPS)
3)pygame初始化就是调用pygame.init()。这段代码需要在设置所有pygame属性之前调用,初始化之后的其他操作也是如此。
4) OS。Environ [SDL _视频_窗口_位置]=% d,% d% (0,25)。指定pygame窗口的左上角显示在坐标(0,25)上,即距离屏幕左侧0像素,距离屏幕顶部25像素;如果没有设置,默认窗口显示屏就在正中央。
5)Surface=py game . display . set _ mode((800,500)),设置游戏窗口大小为800像素宽,500像素高;
当然也可以设置surface=py game . display . set _ mode((0,0)),这是全屏显示。
但是,如果你只是简单地这样设置全屏,你会发现窗口的大小是固定的,无法缩小。要达到默认显示全屏,但可以随意调整的目的,可以这样设置:surface=py game . display . set _ mode((0,0),py game . resizable);以上两种方式显示的全屏都有一个问题,就是还能看到游戏窗口的标题栏和桌面的任务栏,严格意义上不是全屏。如果想让游戏画面覆盖整个屏幕,需要这样设置:surface=py game . display . set _ mode((0,0),py game . full screen)6)py game . display . set _ caption( py game教程)
7)py game . image . load( e:\ as-workspace \ py game test \ drawable \ icon . png )。convert _ alpha(),将本地图片的像素数据复制到一个Surface对象中存储,为后续绘制到屏幕上做准备。
因为是png图片,所以需要额外处理alpha通道,所以我们需要使用convert_alpha()将其转换为与我们屏幕显示相同的像素格式,这样可以获得最快的渲染速度;如果是没有alpha通道的jpg格式图片,也就是没有透明背景的图片,可以使用convert()直接转换成pygame最快的渲染格式。注意:最好对每张图片都调用covert方法,这样可以提高渲染速度。否则pygame每次绘制都会根据屏幕显示的像素格式自动转换,会降低渲染速度。可能会出现卡顿现象8)pygame.display.set_icon(icon),将指定图片的表面对象设置为程序的图标。
9)scale img=py game . transform . scale(icon,(400,400)),将图片缩小/放大到指定的宽度和高度,并返回缩小/放大后的图片表面对象。
10)rect=scaleImg.get_rect(),获取图片的矩形面积,即(left,top,width,height),即返回图片左上角的坐标,width,height,但默认返回的左上角坐标为(0,0)。
1) 11)surface.blit(bgSurface,(0,0 (0,0)),将图片绘制到指定的表面对象中,左上角坐标为(0,0)。注意:这里图片只是画在表面上,并没有渲染到屏幕上。也就是说,只做了这一步,屏幕上就看不到新画的内容了。还需要调用pygame.display.flipupdate
12) rect=rect.move(step,0),将rect沿X轴移动步长像素,沿Y轴移动0像素,即step为整数时,将步长像素向右移动,step为负数时,将步长像素向左移动。
13) PyGames通过事件队列处理所有的事件消息,但是事件队列有一个上限。标准的SDL 1.2规定队列长度为128。如果事件队列中的事件超过了限制,那么后续的事件将被丢弃,你的程序将显示无法响应卡住的事件。因此,请确保使用以下方法之一来处理每一帧中的事件:pygame.event.get()、pygame.event.pump()、pygame.event.wait()、pygame.event.peek()或pygame.event.clear()
对于pygame.event.get()中的event点击关闭if event . type==pygame . quit:exit flag=true 14)由于py game是逐帧绘制的,所以在画面移动的时候,如果没有擦除前一帧绘制的画面,就会出现一堆重叠的画面。这就是所谓的“脏图”,所以上面的代码可以看到,在每一帧刷新中,背景的指定区域rect都被擦除:surface.blit (BG surface,rect,rect),即背景图像的指定区域被重画覆盖脏图。当然,你也可以重新绘制整个背景图像,但这太耗费性能了。
15)同时,我们在更新画图内容到屏幕显示时,不要一下子调用pygame.display.update()来更新整个屏幕,因为根据计算,在一台性能一般的机器中,每次调用update都需要将近35ms来更新整个屏幕,所以你最多只能在1秒内刷新一次:1000/35=28帧。但是没有时间计算游戏逻辑,画图,获取输入输出等。仅仅更新一秒钟最多只能刷新28帧。所以,你这样算的话,很容易卡死。那么,有什么解决办法吗?看上面的代码,我们可以只刷新图片发生变化的区域,这样就可以得到最高的刷新率:pygame.display.update ([rect,newrect])。换句话说,我们可以用链表集合来记录每一帧图片的变化区域,然后只刷新这些区域。
文本对齐
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。