一、介绍

官网: https://www.pygame.org
官方文档:https://www.pygame.org/docs/tut/PygameIntro.html
pip install pygame
image.png
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 管理图像和屏幕

image.png

  1. ##游戏
  2. import sys ##导入sys模块
  3. import pygame ##导入pygame模块
  4. pygame.init() ##初始化pygame
  5. size = widthheight = 320,240 ##设置窗口
  6. scream = pygame.display.set_mode(size) ##创建一个图形窗口,并调用pygame.display.set_mode()
  7. ##执行死循环,确保窗口一直开启
  8. while True:
  9. ##检查事件
  10. for event in pygame.event.get(): ##遍历所有事件
  11. if event.type == pygame.QUIT: ##如果单击关闭窗口,则退出
  12. sys.exit()
  13. 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() 测试两个矩形的角度是否重叠
  1. ##Example
  2. import sys, pygame ##导入sys和pygame模块
  3. pygame.init() ##初始化pygame模块
  4. size = width, height = 640,480 ##设置窗口
  5. screen = pygame.display.set_mode(size) ##显示窗口
  6. color = (0,0,0) ##设置颜色
  7. ball = pygame.image.load("E:\\pythonstduy\\py_game_l\\ball.png") ##加载图片,ball值相当于一个Surface对象。
  8. ballrect = ball.get_rect() ##获取矩形区域
  9. speed = [5,5] ##设置移动的X轴,Y轴距离
  10. clock = pygame.time.Clock() ##设置时钟
  11. ##执行死循环,确保窗口一直显示
  12. while True:
  13. clock.tick(60) ##设置每秒执行60次
  14. ##检查事件
  15. for event in pygame.event.get(): ##pygame.event.get() 能够获取事件队列
  16. if event.type == pygame.QUIT: ##pygame.QUI 表示检测到关闭pygame窗口事件,如果单击关闭窗口,则退出
  17. sys.exit()
  18. ballrect = ballrect.move(speed) ##移动小球
  19. ##添加碰撞检测,如果不添加碰撞检测的话,小球将会在屏幕中一闪而过
  20. ##碰到左右边缘
  21. if ballrect.left < 0 | ballrect.right> width:
  22. speed [0] = -speed[0] ##更改x轴的数据为负值
  23. ##碰到上下边缘
  24. if ballrect.top < 0 | ballrect.bottom> height:
  25. speed [1] = -speed[1] ##更改Y轴的数据为负值
  26. screen.fill(color) ##填充颜色
  27. screen.blit(ball,ballrect) ##将图片画到窗口上
  28. pygame.display.flip() ##更新全部显示
  29. pygame.quit() ##退出pygame

四、Flappy Bird游戏

Flappy Bird一款鸟类飞行游戏,玩家只需要一根手指来操控,单击储名手机屏幕,小鸟就会往上飞,不断点击就会不停往高出飞,放松手指,则会快速下降。
游戏中主要有两个对象:小鸟和管道,创建Bird类和Pineline类来表示这两个对,小鸟可以通过上下移动来躲避管道,管道需要一直向左侧移动,在窗口中就好像小鸟一直在移动。
创建小鸟类,需要定义小鸟飞行的速度、跳跃的高度,还需要一个方法来定义小鸟的跳跃和坠落
创建管道类,需要加载上下管道,还需要定义管道向左移动的速度,并且当管道移动出屏幕的时候重新绘制下一组管道。
创建分数类,当小鸟飞过管道的时候,玩家得一分,当管道移动到窗体左侧一定距离得时候,默认小鸟飞过管道,使分数加一。
需要添加碰撞检测,当小鸟与管道相撞得时候,小鸟的颜色变为灰色,游戏结束,并且显示总分数。

  1. import sys, pygame ,random ##导入sys、pygame、random模块
  2. class Bird(object):
  3. ##定义一个鸟类
  4. def __init__(self):
  5. ##定义初始化的方法
  6. self.birdRect = pygame.Rect(65,50,50,50) ##鸟的矩形
  7. ##定义鸟的三种状态
  8. self.birdStatus = [pygame.image.load("E:\\pythonstduy\\py_game_l\\1.png"),
  9. pygame.image.load("E:\\pythonstduy\\py_game_l\\2.png"),
  10. pygame.image.load("E:\\pythonstduy\\py_game_l\\dead.png")]
  11. self.status = 0 ##默认飞行状态
  12. self.birdX = 120 ##鸟所在X轴坐标
  13. self.birdY = 350 ##鸟所在Y轴坐标
  14. self.jump = False ##默认情况下小鸟自动降落
  15. self.jumpSpeed = 10 ##跳跃高度
  16. self.gravity = 5 ##重力
  17. self.dead = False ##默认小鸟生命状态为活着
  18. def birdUpdate(self):
  19. if self.jump:
  20. ##小鸟跳跃
  21. self.jumpSpeed -= 1 ##速度递减,上升越来越慢
  22. self.birdY -= self.jumpSpeed ##鸟Y轴坐标减小,小鸟上升
  23. else:
  24. ##小鸟坠落
  25. self.gravity += 0.2 ##重力增加,下降越来越快
  26. self.birdY += self.gravity ##鸟Y轴坐标增大,小鸟下降
  27. self.birdRect[1] = self.birdY ##更改Y轴坐标
  28. class Pipeline(object):
  29. ##定义一个管道类
  30. def __init__(self):
  31. ##定义初始化的方法
  32. self.wallx = 400 ##管道所在X轴坐标
  33. self.pineUP = pygame.image.load("E:\\pythonstduy\\py_game_l\\pipe2.png") ##加载上管道图片
  34. self.pipeDown = pygame.image.load("E:\\pythonstduy\\py_game_l\\pipe1.png") ##加载下管道图片
  35. def PipelineUpdate(self):
  36. ##水平移动
  37. self.wallx -= 5 ##管道轴坐标递减,即管道向左移动
  38. ##当管道运行到一定位置,即小鸟飞越管道,分数加一,并且重置管道
  39. if self.wallx <-80:
  40. global score
  41. score += 1
  42. self.wallx = 400
  43. def createMap():
  44. ##定义创建地图的方法
  45. screen.fill((255,255,255)) ##填充颜色
  46. screen.blit(background,(0,0)) ##填入到背景
  47. ##显示管道
  48. screen.blit(Pipeline.pineUP,(Pipeline.wallx,-300)) ##上管道坐标位置
  49. screen.blit(Pipeline.pipeDown,(Pipeline.wallx,500)) ##下管道坐标位置
  50. Pipeline.PipelineUpdate() ##管道移动
  51. ##显示小鸟
  52. if Bird.dead:
  53. Bird.status = 2 ##撞管道状态
  54. elif Bird.jump:
  55. Bird.status = 1 ##起飞状态
  56. screen.blit(Bird.birdStatus[Bird.status],(Bird.birdX,Bird.birdY)) ##设置小鸟的坐标
  57. Bird.birdUpdate() ##鸟移动
  58. ##显示分数
  59. screen.blit(font.render(str(score),-1,(255,255,255)),(200,50)) ##设置颜色及坐标位置
  60. pygame.display.update() ##更新显示
  61. ##碰撞检测
  62. def checkDead():
  63. ##上方管子的矩形位置
  64. upRect = pygame.Rect(Pipeline.wallx,-300,Pipeline.pineUP.get_width()-10,Pipeline.pineUP.get_height())
  65. ##下方管子的矩形位置
  66. downRect = pygame.Rect(Pipeline.wallx,500,Pipeline.pipeDown.get_width()-10,Pipeline.pipeDown.get_height())
  67. ##检测小鸟与上下方管子是否碰撞
  68. if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): ##colliderect()测试两个矩形的角度是否重叠,
  69. Bird.dead = True
  70. ##检测小鸟是否飞出上下边界
  71. if not 0 <Bird.birdRect[1]<height:
  72. Bird.dead = True
  73. return True
  74. else:
  75. return False
  76. ##显示结果
  77. def getResult():
  78. final_Text1 = "Game Over!!! "
  79. final_Text2 = "Your Score is :"+str(score)
  80. final_font1 = pygame.font.SysFont("Arial",70) ##第一行文字字体
  81. final_surf1 = font.render(final_Text1, 1,(242,3,36)) ##第一行文字颜色
  82. final_font2 = pygame.font.SysFont("Arial",50) ##第二行文字字体
  83. final_surf2 = font.render(final_Text2, 1,(253,177,6)) ##第二行文字颜色
  84. ##设置第一行文字显示位置
  85. screen.blit(final_surf1,[screen.get_width()/2-final_surf1.get_width()/2,300])
  86. ##设置第二行文字显示位置
  87. screen.blit(final_surf2,[screen.get_width()/2-final_surf2.get_width()/2,200])
  88. ##更新整个待显示的Surface对象到屏幕上
  89. pygame.display.flip()
  90. if __name__ == "__main__":
  91. ##主程序
  92. pygame.init() ##初始化pygame
  93. pygame.font.init() ##初始化字体
  94. font = pygame.font.SysFont(None,50) ##设置默认字体和大小
  95. size = width, height = 400,680 ##设置窗口
  96. screen = pygame.display.set_mode(size) ##显示窗口
  97. clock = pygame.time.Clock() ##设置时钟
  98. Pipeline = Pipeline() ##实例化管道类
  99. Bird = Bird() ##实例化小鸟类
  100. score = 0 ##实例化分数
  101. while True:
  102. clock.tick(60) ##每秒执行60次
  103. ##轮询事件
  104. for event in pygame.event.get():
  105. if event.type == pygame.QUIT: ###pygame.QUI 表示检测到关闭pygame窗口事件,如果单击关闭窗口,则退出
  106. sys.exit()
  107. if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
  108. Bird.jump = True ##跳跃
  109. Bird.gravity = 5 ##重力
  110. Bird.jumpSpeed = 10 ##跳跃速度
  111. background = pygame.image.load("E:\\pythonstduy\\py_game_l\\sky.png") ##加载背景图片
  112. if checkDead(): ##判断小鸟状态
  113. getResult()
  114. else:
  115. createMap() ##绘制地图
  116. pygame.quit() ##退出

image.png