初识:python pygame 是一款免费的适用于2D电子游戏开发的软件包,有良好的跨平台特性
安装:pip install pygame
初始化加载模块:开始
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
创建窗口
pygame.display模块
作用:创建游戏主窗口
常见的内置方法:
方法 | 作用 |
pygame.display.init() | 初始化display模块 |
pygame.display.quit() | 结束display模块 |
pygame.display.get_init() | 判断是否被初始化 |
pygame.display.set_mode() | 初始化一个准备显示的界面 |
pygame.display.get.surface() | 获取当前surface对象 |
pygame.display.flip() | 显示刷新 |
pygame.display.update() | 更新部分内容显示到屏幕 |
程序更新:
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
上例运行,会出现一个黑色的窗口且一闪而过,这是因为执行完毕后自动关闭,若想让窗口一直显示,需要使用循环反复执行,手动关闭
程序更新:
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
while True: # 循环显示窗口
screen = pygame.display.set_mode(size) # 显示窗口
上例程序运行,对于窗口增加了死循环可以达到窗口的一直显示,但无法实现手动关闭,由于pygame采用事件驱动,可以使用事件检测方法实现窗口的手动关闭
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
while True: # 循环显示窗口
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
上例程序执行,添加了轮训事件的检测,pygame.event.get()可以获取事件队列,通过for循环读取每一个事件,在根据type属性判断事件的类型是否属于关闭窗口事件
添加小球
image模块
作用:用于pygame中图像的传输及处理
常见方法:
方法 | 作用 |
pygame.image.load() | 从文件加载图片 |
pygame.image.save() | 将图片保存到磁盘 |
pygame.image.get_extended() | 检测是否支持载入扩展图像格式 |
pygame.image.tostring() | 将图像转为字符串 |
pygame.image.fromstring() | 将字符串转为图像 |
支持图像格式:jpg、png、gif、bmp、pcx等
注意:当一个图像成功加载后,或被转为surface对象,允许在加载后的图像上进行后期处理,如:描边、设置像素大小、捕获图形区域等
程序更新:
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.jpg') # 加载小球图片,不会显示
while True: # 循环显示窗口
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
10.6 处理surface对象
10.6.1 image.load()方法加载图片后会返回一个surface对象,表示图片,可以进行后期处理,如:变形、复制、涂画等操作
10.6.2 常用方法
方法 | 作用 |
pygame.Surface.blit() | 将图形绘制到另一个图像上 |
pygame.Surface.convert() | 转换图像的格式 |
pygame.Surface.fill() | 使用颜色填充Surface区域 |
pygame.Surface.get_rect() | 获取Surface矩形区域 |
10.6.3 程序更新:
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.jpg') # 加载小球图片,不会显示
ballrect = ball.get_rect() # 获取矩形区域,本质为小球图片所占的区域,只不过没有内容
while True: # 循环显示窗口
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
screen.fill(color) # 填充颜色
screen.blit(ball, ballrect) # 将小球图片加载到窗口矩形区域
pygame.display.flip() # 刷新
移动小球
小球ballrect拥有move()方法,可以用于移动,move(x,y)表示x轴与y轴的移动距离,左上角坐标为(0,0),可以设置move(5,5)
程序更新
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.jpg') # 加载小球图片,不会显示
ballrect = ball.get_rect() # 获取矩形区域,本质为小球图片所占的区域,只不过没有内容
while True: # 循环显示窗口
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
ballrect = ballrect.move(5, 5) # 斜向移动小球区域
screen.fill(color) # 填充颜色
screen.blit(ball, ballrect) # 将小球图片加载到窗口矩形区域
pygame.display.flip() # 刷新
上例运行,小球移动太快了,代码运行时间太短了,导致肉眼出现视觉错乱,因此需要添加一个时钟来控制程序的运行
pygame.time模块
作用:pygame 中控制时间的模块
常见的方法
方法 | 作用 |
pygame.time.get_ticks() | 获取以毫秒为单位的时间 |
pygame.time.wait() | 暂停一段时间 |
pygame.time.set_timer() | 在事件队列上重复创建一个事件 |
pygame.time.Clock() | 创建一个对象跟踪时间 |
pygame中时间以毫秒(1/1000秒)表示
程序更新
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.jpg') # 加载小球图片,不会显示
ballrect = ball.get_rect() # 获取矩形区域,本质为小球图片所占的区域,只不过没有内容
clock = pygame.time.Clock() # 创建时钟
while True: # 循环显示窗口
clock.tick(60) # 更新时钟,程序不会超过60帧
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
ballrect = ballrect.move(5, 5) # 斜向移动小球区域
screen.fill(color) # 填充颜色
screen.blit(ball, ballrect) # 将小球图片加载到窗口矩形区域
pygame.display.flip() # 刷新
碰撞检测
上例中吗,小球实现慢速移动吗,但会移动窗体之外,所以增加碰撞检测,即小球区域与窗体任意一个边缘发生碰撞则更改小球的移动方法
程序更新:结束
import sys
import pygame
pygame.init() # 调用init()方法进行初始化
size = width, height = 640, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.jpg') # 加载小球图片,不会显示
ballrect = ball.get_rect() # 获取矩形区域,本质为小球图片所占的区域,只不过没有内容
clock = pygame.time.Clock() # 创建时钟
speed = [5, 5] # 设置x,y轴的移动距离
while True: # 循环显示窗口
clock.tick(60) # 更新时钟,程序不会超过60帧
# 检查事件:显示窗口、点击退出都以一种事件,通过循环读取事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭叉叉则执行关闭窗口退出系统
pygame.quit()
sys.exit()
ballrect = ballrect.move(speed) # 斜向移动小球区域
if ballrect.left<0 or ballrect.right>width: # 左右边缘碰撞检测
speed[0] = -speed[0]
if ballrect.top<0 or ballrect.bottom>height: # 上下边缘碰撞检测
speed[1] = -speed[1]
screen.fill(color) # 填充颜色
screen.blit(ball, ballrect) # 将小球图片加载到窗口矩形区域
pygame.display.flip() # 刷新
效果图