python--pygame入门--2.3--基础使用--游戏循环和游戏时钟
·
python–pygame入门–2.3–基础使用–游戏循环和游戏时钟
1、游戏中的动画实现原理
- 跟 电影 的原理类似,游戏中的动画效果,本质上是 快速 的在屏幕上绘制 图像
- 电影是将多张 静止的电影胶片 连续、快速的播放,产生连贯的视觉效果!
- 一般在电脑上 每秒绘制 60 次,就能够达到非常 连续 高品质 的动画效果
- 每次绘制的结果被称为 帧 Frame


2、游戏循环
2.1、游戏的两个组成部分
游戏循环的开始 就意味着 游戏的正式开始

2.2、游戏循环的作用
- 保证游戏 不会直接退出
- 变化图像位置 —— 动画效果
- 每隔
1 / 60 秒移动一下所有图像的位置 - 调用
pygame.display.update()更新屏幕显示
- 每隔
- 检测用户交互 —— 按键、鼠标等…
3、游戏时钟
pygame专门提供了一个类pygame.time.Clock可以非常方便的设置屏幕绘制速度 —— 刷新帧率- 要使用 时钟对象 需要两步:
- 1)在 游戏初始化 创建一个 时钟对象
- 2)在 游戏循环 中让时钟对象调用
tick(帧率)方法
tick方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时
# 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0
# 游戏循环
while True:
# 设置屏幕刷新帧率
clock.tick(60)
print(i)
i += 1
# 导入pygame模块
import pygame
# 导入并初始化所有 `pygame` 模块,使用其他模块之前,必须先调用 `init` 方法
pygame.init()
# 英雄的指标
hero_rect = pygame.Rect(100, 500, 120, 126)
# 创建游戏主窗口
screen = pygame.display.set_mode((480, 700))
# --------------绘制背景图像--------------
# 1> 加载图像
bg = pygame.image.load("../../resource/image/background.png")
# 2> 绘制在屏幕
screen.blit(bg, (0, 0))
# --------------绘制英雄图像--------------
# 1> 加载图像
hero = pygame.image.load("../../resource/image/me1.png")
# 2> 绘制在屏幕
screen.blit(hero, (200, 500))
# 3> 更新显示 - update 方法会把之前所有绘制的结果,一次性更新到屏幕窗口上
pygame.display.update()
# 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0
# 游戏循环
while True:
# 设置屏幕刷新帧率
clock.tick(60)
print(i)
i += 1
# 卸载所有 `pygame` 模块,在游戏结束之前调用!
pygame.quit()

4、英雄的简单动画实现
需求
- 在 游戏初始化 定义一个
pygame.Rect的变量记录英雄的初始位置 - 在 游戏循环 中每次让 英雄 的
y - 1—— 向上移动 y <= 0将英雄移动到屏幕的底部
提示:
- 每一次调用
update()方法之前,需要把 所有的游戏图像都重新绘制一遍- 而且应该 最先 重新绘制 背景图像
# 4. 定义英雄的初始位置
hero_rect = pygame.Rect(170, 500, 102, 126)
while True:
# 可以指定循环体内部的代码执行的频率
clock.tick(60)
# 更新英雄位置
hero_rect.y -= 1
# 英雄向上飞行,当 英雄完全从上方飞出屏幕后,将飞机移动到屏幕的底部
# if hero_rect.y + hero_rect.height <= 0:
# 如果移出屏幕,则将英雄的顶部移动到屏幕底部
if hero_rect.y <= 0:
hero_rect.y = 700
# 绘制背景图片
screen.blit(bg, (0, 0))
# 绘制英雄图像
screen.blit(hero, hero_rect)
# 更新显示
pygame.display.update()
# 导入pygame模块
import pygame
# 导入并初始化所有 `pygame` 模块,使用其他模块之前,必须先调用 `init` 方法
pygame.init()
# 创建游戏主窗口
screen = pygame.display.set_mode((480, 700))
# --------------绘制背景图像--------------
# 1> 加载图像
bg = pygame.image.load("../../resource/image/background.png")
# 2> 绘制在屏幕
screen.blit(bg, (0, 0))
# --------------绘制英雄图像--------------
# 1> 加载图像
hero = pygame.image.load("../../resource/image/me1.png")
# 2> 绘制在屏幕
screen.blit(hero, (200, 500))
# 3> 更新显示 - update 方法会把之前所有绘制的结果,一次性更新到屏幕窗口上
pygame.display.update()
# 创建游戏时钟对象
clock = pygame.time.Clock()
# 4. 定义英雄的初始位置
hero_rect = pygame.Rect(170, 500, 102, 126)
while True:
# 可以指定循环体内部的代码执行的频率
clock.tick(60)
# 更新英雄位置
hero_rect.y -= 1
# 英雄向上飞行,当 英雄完全从上方飞出屏幕后,将飞机移动到屏幕的底部
# if hero_rect.y + hero_rect.height <= 0:
# 如果移出屏幕,则将英雄的顶部移动到屏幕底部
if hero_rect.y <= 0:
hero_rect.y = 700
# 绘制背景图片
screen.blit(bg, (0, 0))
# 绘制英雄图像
screen.blit(hero, hero_rect)
# 更新显示
pygame.display.update()
# 卸载所有 `pygame` 模块,在游戏结束之前调用!
pygame.quit()

5、在游戏循环中 监听事件
5.1、事件 event
- 就是游戏启动后,用户针对游戏所做的操作
- 例如:点击关闭按钮,点击鼠标,按下键盘…
5.2、监听
- 在 游戏循环 中,判断用户 具体的操作
只有 捕获 到用户具体的操作,才能有针对性的做出响应
5.3、代码实现
pygame中通过pygame.event.get()可以获得 用户当前所做动作 的 事件列表- 用户可以同一时间做很多事情
- 提示:这段代码非常的固定,几乎所有的
pygame游戏都 大同小异!
# 游戏循环
while True:
# 可以指定循环体内部的代码执行的频率
clock.tick(60)
# 事件监听
for event in pygame.event.get():
# 判断用户是否点击了关闭按钮
if event.type == pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()
更多推荐
所有评论(0)