这节课我们来谈谈事件,什么是事件呢?
事实上,我们可以看到,游戏就是一个死循环,如果我们不去干预它的话,它会自己玩得很开心,像之前我们写的乱跑的小蛇。而事件就是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
screen = pygame.display.set_mode(size)
pygame.display.set_caption("初次见面,请大家多多关照!")
f = open("record.txt", "w") #创建文件,写入形式
while True:
for event in pygame.event.get(): #迭代每一个事件
f.write(str(event) + "\n") #将每一个事件写入文件,以换行符隔开
if event.type == pygame.QUIT:
f.close() #关闭文件
sys.exit()
得到的 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
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Python Demo")
bg = (0, 0 , 0)
position = 0
#实例化Font对象
font = pygame.font.Font(None, 20)
line_height = font.get_linesize()
screen.fill(bg) #背景画布填充为黑色
while True:
for event in pygame.event.get(): #迭代每一个事件
if event.type == pygame.QUIT:
sys.exit()
screen.blit(font.render(str(event), True, (0, 255, 0)), (0, position))
position += line_height
if position > height:
position = 0
screen.fill(bg)
pygame.display.flip()
在代码运行过程中,会将产生的事件依次显示在屏幕上,大家可能对于打印的事件内容和含义还搞不清楚,下表列出了所有常用的Pygame 事件及其含义。
例如 MOUSEMOTION,它有3个属性,pos 表示当前坐标位置,rel 表示距离上一个位置的相对距离,buttons 是一个三元组,表示你按下了哪一个按钮。
接下来我们就可以做一件事了,让疯狂的小蛇受控制了。
我们就不止关注 QUIT 事件了,我们还需要关注 KEYDOWN。(按键事件)
import pygame
import sys
# 初始化Pygame
pygame.init()
size = width, height = 600, 400
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("python.png")
# 获得图像的位置矩形
position = turtle.get_rect()
l_head = turtle
r_head = 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 = l_head #调头
speed = [-1, 0]
if event.key == pygame.K_RIGHT:
turtle = r_head #调头
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)