本节重点理解 Pygame 里的事件
一、事件
- 事件
上一个程序中,点击关闭窗口产生一个 QUIT 事件,Pygame 会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。
事件随时可能发生,而且量也可能很大,Pygame 的做法是把一系列的事件存放在一个队列里,逐个的处理 - 事件检索
上一个程序我们使用Pygame.get()
来处理所有的事件,这如同打开大门所有人可以进入。如果使用Pygame.event.wait()
,Pygame 就会等到下一个事件才继续下去。 - 常用事件集:
事件 | 产生途径 | 参数 |
---|---|---|
QUIT | 用户按下关闭按钮 | none |
ATIVEEVENT | Pygame被激活或者隐藏 | gain, state |
KEYDOWN | 键盘被按下 | unicode, key, mod |
KEYUP | 键盘被放开 | key, mod |
MOUSEMOTION | 鼠标移动 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠标按下 | pos, button |
MOUSEBUTTONUP | 鼠标放开 | pos, button |
JOYAXISMOTION | 游戏手柄(Joystick or pad)移动 | joy, axis, value |
JOYBALLMOTION | 游戏球(Joy ball)移动 | joy, axis, value |
JOYHATMOTION | 游戏手柄(Joystick)移动 | joy, axis, value |
JOYBUTTONDOWN | 游戏手柄按下 | joy, button |
JOYBUTTONUP | 游戏手柄放开 | joy, button |
VIDEORESIZE | Pygame窗口缩放 | size, w, h |
VIDEOEXPOSE | Pygame窗口部分公开(expose) | none |
USEREVENT | 触发了一个用户事件 | code |
二、简单示例
将鼠标键盘操作打印到文本中
import pygame
import sys
pygame.init()
size = width,height=600,400
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Hello World")
f = open("recond.txt",'w')
while True:
for event in pygame.event.get():
f.write(str(event) + '\n')
if event.type == pygame.QUIT:
f.close()
sys.exit() # 退出程序
三、将事件打印到屏幕上显示
import pygame
import sys
pygame.init()
size = width,height=600,400
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Test_Demo")
bg = (0,0,0)
font = pygame.font.Font(None,20)
line_height = font.get_linesize()
position = 0
screen.fill(bg)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# render(文本,抗锯齿,颜色,背景=无),这里文本被显示为绿色
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() # 更新显示整个内容
效果图:
四、改进上节的代码增加键盘控制
import pygame
import sys
from pygame.locals import *
# 初始化 pygame
pygame.init()
size = width,height = 600,400
speed = [-2,1]
bg = (255,255,255) # 背景设置为白色
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口的标题
pygame.display.set_caption("初次见面,请大家多多关照")
# 加载图片
chicken = pygame.image.load("chicken.png")
l_head = chicken
# pygame.transform.flip(Surface,xbool,ybool),垂直或者水平翻转
# 这里设置水平翻转
r_head = pygame.transform.flip(chicken,True,False)
# 获得图像的位置矩形
position = chicken.get_rect()
# 设置为死循环,确保窗口一直显示
while True:
# 遍历所有的事件
for event in pygame.event.get():
# 如果单击关闭窗口,则退出
if event.type == pygame.QUIT:
sys.exit()
# 根据键盘操作来控制小鸡的移动
if event.type == KEYDOWN:
if event.key == K_LEFT:
chicken = r_head
speed = [-1,0]
if event.key == K_RIGHT:
chicken = l_head
speed = [1,0]
if event.key == K_UP:
speed = [0, -1]
if event.key == K_DOWN:
speed = [0, 1]
# 移动图像
position = position.move(speed)
# 反转图像
if position.left < 0 or position.right > width:
chicken = pygame.transform.flip(chicken,True,False)
# 反方向移动
speed[0] = -speed[0]
if position.top < 0 or position.bottom > height:
speed[1] = -speed[1]
# 填充背景
screen.fill(bg)
# 更新图像
screen.blit(chicken,position)
# 更新界面
pygame.display.flip()
# 延迟 5 毫秒
pygame.time.delay(5)
效果图