一、介绍
官网: https://www.pygame.org
官方文档:https://www.pygame.org/docs/tut/PygameIntro.html
pip install pygame 
Pygame和SDL是2D游戏的出色的C引擎,游戏仍然会发现其运行时的大部分时间都花在了SDL内处理图形,SDL可以利用图形硬件加速的优势,让游戏以每秒更高帧数的速度运行。
但是当游戏变得复杂的时候,有一些局限性,管理硬件加速图形的最佳方法并不总是从软件渲染中获得最快结果的方法。
二、模块介绍
Pygame做游戏开发的时候,不需要过多地考虑底层相关的内容,可以把工作重心放在游戏逻辑上,因为它集成了很多和底层相关的模块。
| 模块名称 | 说明 |
|---|---|
| cdrom | 访问光驱 |
| cursors | 加载光标图像,包括标准光标 |
| diaplay | 访问显示设备 |
| draw | 绘制形状、线和点 |
| event | 管理事件和事件队列 |
| font | 创建和渲染TrueType字体 |
| image | 保存并加载图片 |
| joystick | 使用游戏手柄或类似的东西 |
| key | 读取键盘按键 |
| mouse | 管理鼠标 |
| sndarray | 用numpy操作声音 |
| surfarray | 用numpy处理图像 |
| time | 管理实践的帧信息 |
| transform | 缩放、旋转和翻转图像 |
| mixer | 声音 |
| movie | 播放视频 |
| music | 播放音频 |
| overlay | 访问高级视频叠加 |
| rect | 管理矩形区域 |
| sprite | 操作移动图像 |
| surface | 管理图像和屏幕 |

##游戏import sys ##导入sys模块import pygame ##导入pygame模块pygame.init() ##初始化pygamesize = widthheight = 320,240 ##设置窗口scream = pygame.display.set_mode(size) ##创建一个图形窗口,并调用pygame.display.set_mode()##执行死循环,确保窗口一直开启while True:##检查事件for event in pygame.event.get(): ##遍历所有事件if event.type == pygame.QUIT: ##如果单击关闭窗口,则退出sys.exit()pygame.quit() ##退出pygame
scream = pygame.display.set_mode(size) ##创建一个图形窗口,并调用pygame.display.set_mode()
Pygame和SDL通过默认使用图形硬件的最佳图形模式来简化这个操作,Pygame将图形表示为Surface对象,display.set_mode() 函数创建一个新的Surface对象,该对象代表实际显示的图形。
三、使用
制作一个跳跃的小球游戏。
首先创建一个游戏窗口,然后再窗口内创建一个小球,以一定的速度移动小球,当小球碰到游戏窗口的边缘的时候,小球弹回,继续移动。
display模块显示窗体,常用方法如下:
| 方法 | 说明 |
|---|---|
| pygame.display.init | 初始化显示模块 |
| pygame.display.quit | 取消初始化显示模块,意味着任何活动的显示都将关闭,程序退出的时候,会自动处理 |
| pygame.display.get_init | 如果显示模块已经初始化,则返回True |
| pygame.display.set_mode | 初始化要显示的窗口或屏幕 set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) size表示宽度和高度 flags参数时其他参数选项的集合 depth参数代表用于颜色的位数 |
| pygame.display.get_surface | 获取当前的Surface对象,如果未设置显示模式,则将返回无 |
| pygame.display.flip | 更新整个待显示的Surface对象到屏幕上 |
| pygame.display.update | 更新部分内容显示到屏幕上,如果没有参数则与flip功能相同 |
Surface对象时用来代表图片的pygame对象,具有固定的分辨率和像素格式可以对一个Surface对象进行涂画、变形、复制等各种操作。
https://www.pygame.org/docs/ref/surface.html?highlight=surface#pygame.Surface.subsurface
Suface对象的常用方法如下
| 方法 | 说明 |
|---|---|
| pygame.Surface.blit | 将一个图像画到另一个图像上 |
| pygame.Surface.convert | 转换图像的像素格式 |
| pygame.Surface.convert_alpha | 转换图像的像素格式,包含alpha通道的转换 |
| pygame.Surface.fill | 使用颜色填充Surface |
| pygame.Surface.get_rect | 获取Surface的矩形区域 |
Pygame使用Rect对象存储和操纵矩形区域,可以被左、上、宽度和高度值得组合创建,也可以从已经是Rect或具有名为”rect”属性的Python对象创建。
https://www.pygame.org/docs/ref/rect.html?highlight=rect#pygame.Rect
Rect对象的方法如下
| 方法 | 说明 |
|---|---|
| copy() | 复制矩形角,返回具有与原始位置和大小相同的新的矩形角度 |
| move(x,y) | 移动矩形角度,只会修改Rect的新副本以及受影响的更改,原始的Rect不会被修改 |
| move_ip(x,y) | 将矩形角度移动到位,返回为None,但是会影响原始的Rect |
| inflate() | 增到或缩小矩形角度 |
| inflate_ip() | 在适当位置增加或缩小矩形角度大小 |
| update() | 设置的位置和大小矩形角 |
| clamp() | 将矩形内移 |
| clip() | 在另一个内切成一个直角 |
| collidedict() | 如果测试一个RECT在字典中交叉角 |
| colliderect() | 测试两个矩形的角度是否重叠 |
##Exampleimport sys, pygame ##导入sys和pygame模块pygame.init() ##初始化pygame模块size = width, height = 640,480 ##设置窗口screen = pygame.display.set_mode(size) ##显示窗口color = (0,0,0) ##设置颜色ball = pygame.image.load("E:\\pythonstduy\\py_game_l\\ball.png") ##加载图片,ball值相当于一个Surface对象。ballrect = ball.get_rect() ##获取矩形区域speed = [5,5] ##设置移动的X轴,Y轴距离clock = pygame.time.Clock() ##设置时钟##执行死循环,确保窗口一直显示while True:clock.tick(60) ##设置每秒执行60次##检查事件for event in pygame.event.get(): ##pygame.event.get() 能够获取事件队列if event.type == pygame.QUIT: ##pygame.QUI 表示检测到关闭pygame窗口事件,如果单击关闭窗口,则退出sys.exit()ballrect = ballrect.move(speed) ##移动小球##添加碰撞检测,如果不添加碰撞检测的话,小球将会在屏幕中一闪而过##碰到左右边缘if ballrect.left < 0 | ballrect.right> width:speed [0] = -speed[0] ##更改x轴的数据为负值##碰到上下边缘if ballrect.top < 0 | ballrect.bottom> height:speed [1] = -speed[1] ##更改Y轴的数据为负值screen.fill(color) ##填充颜色screen.blit(ball,ballrect) ##将图片画到窗口上pygame.display.flip() ##更新全部显示pygame.quit() ##退出pygame
四、Flappy Bird游戏
Flappy Bird一款鸟类飞行游戏,玩家只需要一根手指来操控,单击储名手机屏幕,小鸟就会往上飞,不断点击就会不停往高出飞,放松手指,则会快速下降。
游戏中主要有两个对象:小鸟和管道,创建Bird类和Pineline类来表示这两个对,小鸟可以通过上下移动来躲避管道,管道需要一直向左侧移动,在窗口中就好像小鸟一直在移动。
创建小鸟类,需要定义小鸟飞行的速度、跳跃的高度,还需要一个方法来定义小鸟的跳跃和坠落
创建管道类,需要加载上下管道,还需要定义管道向左移动的速度,并且当管道移动出屏幕的时候重新绘制下一组管道。
创建分数类,当小鸟飞过管道的时候,玩家得一分,当管道移动到窗体左侧一定距离得时候,默认小鸟飞过管道,使分数加一。
需要添加碰撞检测,当小鸟与管道相撞得时候,小鸟的颜色变为灰色,游戏结束,并且显示总分数。
import sys, pygame ,random ##导入sys、pygame、random模块class Bird(object):##定义一个鸟类def __init__(self):##定义初始化的方法self.birdRect = pygame.Rect(65,50,50,50) ##鸟的矩形##定义鸟的三种状态self.birdStatus = [pygame.image.load("E:\\pythonstduy\\py_game_l\\1.png"),pygame.image.load("E:\\pythonstduy\\py_game_l\\2.png"),pygame.image.load("E:\\pythonstduy\\py_game_l\\dead.png")]self.status = 0 ##默认飞行状态self.birdX = 120 ##鸟所在X轴坐标self.birdY = 350 ##鸟所在Y轴坐标self.jump = False ##默认情况下小鸟自动降落self.jumpSpeed = 10 ##跳跃高度self.gravity = 5 ##重力self.dead = False ##默认小鸟生命状态为活着def birdUpdate(self):if self.jump:##小鸟跳跃self.jumpSpeed -= 1 ##速度递减,上升越来越慢self.birdY -= self.jumpSpeed ##鸟Y轴坐标减小,小鸟上升else:##小鸟坠落self.gravity += 0.2 ##重力增加,下降越来越快self.birdY += self.gravity ##鸟Y轴坐标增大,小鸟下降self.birdRect[1] = self.birdY ##更改Y轴坐标class Pipeline(object):##定义一个管道类def __init__(self):##定义初始化的方法self.wallx = 400 ##管道所在X轴坐标self.pineUP = pygame.image.load("E:\\pythonstduy\\py_game_l\\pipe2.png") ##加载上管道图片self.pipeDown = pygame.image.load("E:\\pythonstduy\\py_game_l\\pipe1.png") ##加载下管道图片def PipelineUpdate(self):##水平移动self.wallx -= 5 ##管道轴坐标递减,即管道向左移动##当管道运行到一定位置,即小鸟飞越管道,分数加一,并且重置管道if self.wallx <-80:global scorescore += 1self.wallx = 400def createMap():##定义创建地图的方法screen.fill((255,255,255)) ##填充颜色screen.blit(background,(0,0)) ##填入到背景##显示管道screen.blit(Pipeline.pineUP,(Pipeline.wallx,-300)) ##上管道坐标位置screen.blit(Pipeline.pipeDown,(Pipeline.wallx,500)) ##下管道坐标位置Pipeline.PipelineUpdate() ##管道移动##显示小鸟if Bird.dead:Bird.status = 2 ##撞管道状态elif Bird.jump:Bird.status = 1 ##起飞状态screen.blit(Bird.birdStatus[Bird.status],(Bird.birdX,Bird.birdY)) ##设置小鸟的坐标Bird.birdUpdate() ##鸟移动##显示分数screen.blit(font.render(str(score),-1,(255,255,255)),(200,50)) ##设置颜色及坐标位置pygame.display.update() ##更新显示##碰撞检测def checkDead():##上方管子的矩形位置upRect = pygame.Rect(Pipeline.wallx,-300,Pipeline.pineUP.get_width()-10,Pipeline.pineUP.get_height())##下方管子的矩形位置downRect = pygame.Rect(Pipeline.wallx,500,Pipeline.pipeDown.get_width()-10,Pipeline.pipeDown.get_height())##检测小鸟与上下方管子是否碰撞if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): ##colliderect()测试两个矩形的角度是否重叠,Bird.dead = True##检测小鸟是否飞出上下边界if not 0 <Bird.birdRect[1]<height:Bird.dead = Truereturn Trueelse:return False##显示结果def getResult():final_Text1 = "Game Over!!! "final_Text2 = "Your Score is :"+str(score)final_font1 = pygame.font.SysFont("Arial",70) ##第一行文字字体final_surf1 = font.render(final_Text1, 1,(242,3,36)) ##第一行文字颜色final_font2 = pygame.font.SysFont("Arial",50) ##第二行文字字体final_surf2 = font.render(final_Text2, 1,(253,177,6)) ##第二行文字颜色##设置第一行文字显示位置screen.blit(final_surf1,[screen.get_width()/2-final_surf1.get_width()/2,300])##设置第二行文字显示位置screen.blit(final_surf2,[screen.get_width()/2-final_surf2.get_width()/2,200])##更新整个待显示的Surface对象到屏幕上pygame.display.flip()if __name__ == "__main__":##主程序pygame.init() ##初始化pygamepygame.font.init() ##初始化字体font = pygame.font.SysFont(None,50) ##设置默认字体和大小size = width, height = 400,680 ##设置窗口screen = pygame.display.set_mode(size) ##显示窗口clock = pygame.time.Clock() ##设置时钟Pipeline = Pipeline() ##实例化管道类Bird = Bird() ##实例化小鸟类score = 0 ##实例化分数while True:clock.tick(60) ##每秒执行60次##轮询事件for event in pygame.event.get():if event.type == pygame.QUIT: ###pygame.QUI 表示检测到关闭pygame窗口事件,如果单击关闭窗口,则退出sys.exit()if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:Bird.jump = True ##跳跃Bird.gravity = 5 ##重力Bird.jumpSpeed = 10 ##跳跃速度background = pygame.image.load("E:\\pythonstduy\\py_game_l\\sky.png") ##加载背景图片if checkDead(): ##判断小鸟状态getResult()else:createMap() ##绘制地图pygame.quit() ##退出

