我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛”
一、Pygame Event
事件既发生的某件事,在Pygame中事件有移动或者点击鼠标、按下按键、松开按键或者是经过一定的时间等,都可以称为事件Event,
在之前的程序中,最后都会有一个while True的循环,这个循环会在程序运行期间一致运行,这就是Pygame的事件循环,所以才能看到窗口和图形,否则程序执行完成就停止,也就无法看到窗口和图形了。
只有有按键按下或者鼠标点击都会发生事件,这个事件会存储在队列中等待处理
键盘事件
键盘事件包括KEYUP和KEYDOWN,KEYUP表示松开键盘按键,KEYDOWN表示按下键盘按键,Escape是默认的退出键
新增一个event脚本
代码语言:javascript复制import pygame
from pygame.locals import *
pygame.init()
# 创建一个surface对象
surface_size = (640, 480)
surface = pygame.display.set_mode(surface_size)
background = pygame.Surface(surface.get_size())
background_color = (230, 230, 230)
background.fill(background_color)
clock = pygame.time.Clock()
class Alien(pygame.sprite.Sprite):
def __init__(self, image_file, speed, location):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location
self.speed = speed
def move(self):
if self.rect.left <= surface.get_rect().left or self.rect.right >= surface.get_rect().right:
self.speed[0] = - self.speed[0]
newpos = self.rect.move(self.speed)
self.rect = newpos
alien = Alien('alien.bmp', [10, 0], [20, 20])
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
clock.tick(30)
surface.blit(background, (0, 0))
alien.move()
surface.blit(alien.image, alien.rect)
pygame.display.flip()
pygame.quit()
这段代码实现了一个外星人可以在窗口中不断的移动反弹
我们可以增加一个键盘事件处理器,当按下上方向键或者下方向键时外星人可以上下移动,也就是说需要检测KEYDOWN事件并且检测按键是上方向键还是下方向键,然后再去做相应的处理
修改while代码块
代码语言:javascript复制while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
# 检测是否键盘按下事件
elif event.type == KEYDOWN:
# 判断按键是否是上方向键
if event.key == K_UP:
alien.rect.top -= 10
# 判断按键是否是下方向键
elif event.key == K_DOWN:
alien.rect.top = 10
# 中间代码不变
pygame.quit()
再次重新启动程序,使用上下方向键操作
但是这里还要一个问题,就是当持续按住下方向键时,外星人只会往下移动一次,我们期望的是当连续按下时,外星人可以连续移动,在Pygame中按键一直按下会生成多个KEYDOWN事件也称为按键重复
代码语言:javascript复制# 这段代码放在Alien类上面
delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)
delay是告诉pygane在开始按键重复之前等待多长事件,interval是告诉pygame以多块的速度重复,也就是说重复的各个KEYDOWN事件之间要间隔多长时间,单位都是毫秒
Pygame Event 处理 Pygame 程序中的各种事件,在之前已经使用过Q键或者ESC键退出创建的窗口,除此之外还有其他很多Event,比较常用的有除了QUIT,还有鼠标事件,可以通过pygame.event.get()获取所有的事件
- QUIT
- KEYDOWN
- KEYUP
- MOUSEMOTION
- MOUSEBUTTONUP
- MOUSEBUTTONGDOWN
pygame还给键盘中的按键做了命名,这些都在pygame.locals中,字母都是以K_开头,比如在使用上下方向键操作外星人时,还可以使用K_w键和K_s键来代替上和下方向键
鼠标事件
常用的事件除了键盘事件还有鼠标事件,既用鼠标来进行操作,常用的鼠标事件有三种
- MOUSEBUTTONUP
- MOUSEBUTTONDOWN
- MOUSEMOTION
将操作外星人上下的键盘事件切换为鼠标事件
代码语言:javascript复制while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == MOUSEMOTION:
alien.rect.center = event.pos
# 其余代码不变
pygame.quit()
上述代码中只要发生了鼠标事件,就将event.pos既鼠标的位置赋值给外形人的中心位置,外星人会随着鼠标的移动而移动
这种处理并不好,只要鼠标晃过都会多外星人的位置有影响,更好的实现是拖动,既按照鼠标按键的情况下对外星人的位置进行移动
代码语言:javascript复制held_down = False
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == MOUSEBUTTONDOWN:
held_down = True
elif event.type == MOUSEBUTTONUP:
held_down = False
elif event.type == MOUSEMOTION:
if held_down:
alien.rect.center = event.pos
# 中间代码不变
pygame.quit()
首先判断鼠标按键是否按下,只有鼠标按键按下时拖动鼠标外星人的位置才会随着鼠标移动。
定时器事件
Pygame中还有一种事件是定时器事件,既会按照固定的时间间隔生成事件,pygame定时器事件可以设置为任意间隔,如果定时器到时间,他会创建一个能够被事件循环检测到的事件,pygame设置定时器要使用set_timer()函数
代码语言:javascript复制pygame.time.set_timer(EVENT_NUMBER, interval)
EVENT_NUMBER是事件编号,interval是间隔事件,单位是毫秒
pygame中每一个事件都有一个编号
事件编号从24开始
代码语言:javascript复制direction = 1
pygame.time.set_timer(pygame.USEREVENT, 1000)
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == USEREVENT:
alien.rect.centery = 30
if alien.rect.top <= 0 or alien.rect.bottom >= surface.get_rect().bottom:
direction = -direction
# 中间代码不变
pygame.quit()
外星人会每1000ms向下移动