这节课我们来谈谈事件,什么是事件呢?
事实上,我们可以看到,游戏就是一个死循环,如果我们不去干预它的话,它会自己玩得很开心,像之前我们写的乱跑的小猪。而事件就是Pygame 提供给我们去干预它的机制,例如我们点 关闭,就会产生 QUIT 事件,我们处理这个 QUIT 事件的方法就是调用 sys.exut() 方法来退出整个程序。
事件随时都可能发生,比如你在窗口上面移动鼠标,点击鼠标或者敲击键盘的按键,这些都会产生事件,并且信息量是非常大的。Pygame 的做法就是将这所有产生的事件都放在一个叫做 事件队列里,然后我们通过 for 语句迭代出每一个事件,对我们关注的事件进行处理,像我们刚才关注的 QUIT 事件。如下面代码:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
我们现在来写一个代码,将程序运行期间产生的所有事件记录并保存到一个文件中。大家可以先写一下,再看下面的代码:
import pygame
import sys
# 初始化Pygame
pygame.init()
size = width, height = 800, 600
speed = [-2, 1]
bg = (255, 255, 255) # RGB
#实例化Pygame 的time 模块的 Clock 对象
clock = pygame.time.Clock()
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")
# 加在图片
turtle = pygame.image.load(r"D:\Code\Python\3.png")
# 获得图像的位置矩形
position = turtle.get_rect()
f = open (r'D:\Code\Python\1.txt','w')
while True:
for event in pygame.event.get():
#将时间全部存到文件中
f.write(str(event) + '\n')
if event.type == pygame.QUIT:
f.close()
sys.exit()
# 移动图像
position = position.move(speed)
if position.left < 0 or position.right > width:
# 翻转图像
turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
# 反方向移动
speed[0] = -speed[0]
if position.top < 0 or position.bottom > height:
speed[1] = -speed[1]
# 填充背景
screen.fill(bg)
# 更新图像
screen.blit(turtle, position)
# 更新界面
pygame.display.flip()
# 延迟10毫秒
#pygame.time.delay(10)
#设置帧率
clock.tick(200)
得到的 record.txt 文件里面就可以看到在程序运行期间的所有事件。
接下来我们希望将这些事件显示在 屏幕上,这就涉及到要在屏幕上显示文本的功能,或者要求我们在 Surface 对象上来打印文字,但是很遗憾的告诉大家,Pygame 并没有办法让你在一个 Surface 对象上面绘制你想要的文字,但是Pygame 也提供了可以达到同样效果的途径,我们就需要使用到 font 模块的 render() 方法。
这个render() 方法就是将显示的文字活生生的渲染成一个 Surface 对象,这样你就可以调用 blit() 方法将一个 Surface 对象复制到另一个Surface 上面。
我们就来开始写代码吧:
import pygame
import sys
# 初始化Pygame
pygame.init()
size = width, height = 800, 600
bg = (0, 0,0) # RGB
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
#设置字体对象,第一个参数是字体类型(默认为系统字体),第二个参数是大小
font = pygame.font.Font(None,20)
# 设置窗口标题
pygame.display.set_caption("输出运行期间的所有事件")
#将背景刷成黑色
screen.fill(bg)
#初始化y位置
position = 0
#每一行的高度
font_lineheight = font.get_linesize()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
else:
#使用font中的render方法将事件渲染成图片,第一个参数为要渲染的字符串,第二个参数为是否锯齿化,第三个参数为颜色
font1 = font.render(str(event),True,(0,255,0))
#将渲染好的图片添加到原始图像上,后面要跟上位置参数
screen.blit(font1,(0,position))
#每次行高发生改变
position = position + font_lineheight
#如果到达最底端,则重新从头开始书写
if position > height :
#重新刷成黑色
screen.fill(bg)
position = 0
# 更新界面
pygame.display.flip()
在代码运行过程中,会将产生的事件依次显示在屏幕上
大家可能对于打印的事件内容和含义还搞不清楚,下表列出了所有常用的Pygame 事件及其含义。
例如 MOUSEMOTION,它有3个属性,pos 表示当前坐标位置,rel 表示距离上一个位置的相对距离,buttons 是一个三元组,表示你按下了哪一个按钮。
接下来我们就可以做一件事了,让疯狂的小猪受控制了。
我们就不止关注 QUIT 事件了,我们还需要关注 KEYDOWN。(按键事件)
import pygame
import sys
# 初始化Pygame
pygame.init()
size = width, height = 800, 600
speed = [-2, 1]
bg = (255, 255, 255) # RGB
#实例化Pygame 的time 模块的 Clock 对象
clock = pygame.time.Clock()
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")
# 加在图片
turtle = pygame.image.load(r"D:\Code\Python\3.png")
# 获得图像的位置矩形
position = turtle.get_rect()
#左转
turn_left = turtle
#右转
turn_right = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#如果事件类型是按下某个键
if event.type == pygame.KEYDOWN:
#如果按下的是左键
if event.key == pygame.K_LEFT:
#使小猪翻转
turtle = turn_left
speed = [-1,0]
#如果按下的是右键
if event.key == pygame.K_RIGHT:
turtle = turn_right
speed = [1,0]
#如果按下的是上键
if event.key == pygame.K_UP:
speed = [0,-1]
#如果按下的是下键
if event.key == pygame.K_DOWN:
speed = [0,1]
# 移动图像
position = position.move(speed)
if position.left < 0 or position.right > width:
# 翻转图像
turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
# 反方向移动
speed[0] = -speed[0]
if position.top < 0 or position.bottom > height:
speed[1] = -speed[1]
# 填充背景
screen.fill(bg)
# 更新图像
screen.blit(turtle, position)
# 更新界面
pygame.display.flip()
# 延迟10毫秒
#pygame.time.delay(10)
#设置帧率
clock.tick(200)