一、Pygame Event
事件既发生的某件事,在Pygame中事件有移动或者点击鼠标、按下按键、松开按键或者是经过一定的时间等,都可以称为事件Event,
在之前的程序中,最后都会有一个while True的循环,这个循环会在程序运行期间一致运行,这就是Pygame的事件循环,所以才能看到窗口和图形,否则程序执行完成就停止,也就无法看到窗口和图形了。
只有有按键按下或者鼠标点击都会发生事件,这个事件会存储在队列中等待处理
键盘事件
键盘事件包括KEYUP和KEYDOWN,KEYUP表示松开键盘按键,KEYDOWN表示按下键盘按键,Escape是默认的退出键
新增一个event脚本
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代码块
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事件也称为按键重复
# 这段代码放在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
将操作外星人上下的键盘事件切换为鼠标事件
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既鼠标的位置赋值给外形人的中心位置,外星人会随着鼠标的移动而移动
这种处理并不好,只要鼠标晃过都会多外星人的位置有影响,更好的实现是拖动,既按照鼠标按键的情况下对外星人的位置进行移动
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()函数
pygame.time.set_timer(EVENT_NUMBER, interval) 复制代码
EVENT_NUMBER是事件编号,interval是间隔事件,单位是毫秒
pygame中每一个事件都有一个编号
事件编号从24开始
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向下移动