游戏循环 和 游戏时钟
游戏中的动画效果实质上是在屏幕上进行的快速的绘制图像。
每次被绘制的结果被称为帧(
F
r
a
m
e
Frame
Frame)
游戏的两个重要组成部分:
简单动画的实现:
游戏循环的作用:
1.保证游戏能一直运行下去,不会出现运行完自动退出的情况。
2.变化图像位置 ——动画效果
①:每隔····秒移动一下图像的位置。
②:调用pygame.display.update()
更新屏幕显示。
3.检测用户交互——利用键盘或者鼠标实现对游戏的控制。
游戏时钟的作用:
pygame
中专门有控制帧率的类:pygame.time.Clock()
,可以进行控制帧率。
要使用时钟对象需要两步:
1.游戏初始化创建一个时钟对象
2.在游戏循环中调用tick()
举例代码实现:
import pygame, sys
from pygame.locals import *
pygame.init()
# 时钟对象的初始创建
clock = pygame.time.Clock()
screen = pygame.display.set_mode((800, 800))
bg1 = pygame.image.load(r'C:\Users\TOMMY\Desktop\carrot.png')
# rect型的创建,表示要移动的图像的位置属性,再循环中方便利用他的属性来实现图像的移动
bg1_rect = pygame.Rect(0, 0, 100, 100)
# 2> 绘制在屏幕
screen.blit(bg1, (100, 100))
pygame.display.update() #刷新屏幕内容
while True:
clock.tick(60)
bg1_rect.y -= 1
if bg1_rect.y + bg1_rect.height <= 0:
bg1_rect.y = 700
screen.blit(bg1, bg1_rect)
pygame.display.update()
for event in pygame.event.get(): # 循环获取事件
if event.type == QUIT: # 若检测到事件类型为退出,则退出系统
pygame.quit()
sys.exit()
这样写会有一个错误,那就是没有保证绘制过程中的背景的更新,就会出现以下情况:
他所扫过的一片,背景都会被抹掉,要解决以上问题,要在循环内加一个背景更新的语句,并且这个语句要放在其他图像更新语句的前面:
import pygame, sys
from pygame.locals import *
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((610, 610))
bg1 = pygame.image.load(r'C:\Users\TOMMY\Desktop\carrot.png')
bg_screen = pygame.image.load(r'C:\Users\TOMMY\Desktop\love.png')
bg1_rect = pygame.Rect(100, 100, 100, 100)
while True:
clock.tick(60)
bg1_rect.y -= 1
if bg1_rect.y + bg1_rect.height <= 0:
bg1_rect.y = 700
screen.blit(bg_screen, (0, 0))
screen.blit(bg1, bg1_rect)
pygame.display.update()
for event in pygame.event.get(): # 循环获取事件
if event.type == QUIT: # 若检测到事件类型为退出,则退出系统
pygame.quit()
sys.exit()
运行图片如下所示:
及时运行中经过背景图片也不会被抹去,所以一定要先对screen
进行重绘制(更新)
注意:要操作并进行移动的图像一定要提前定义为rect模式,因为只有这样才能操作他的坐标进行移动操作
游戏循环中的 监听 和 事件
事件: 就是开始游戏后,用户针对游戏所做的操作,例如点击关闭按钮,点击鼠标,点击键盘
监听: 在游戏中,判断用户的具体操作,因为只有捕获到用户的具体操作,才能作出具体的响应。
pygame
中通过 pygame.event.get()
可以获得 用户当前所做动作的事件列表
代码如下:
注解:所有的监听代码都大同小异,差不多都是如下模式,可以理解为模板:
# 游戏循环
while True:
# 事件监听
for event in pygame.event.get():
# 判断用户是否点击了关闭按钮
if event.type == pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()