Easy Games With Python and Pygame(三)- Pygame Event

简介: Easy Games With Python and Pygame(三)- Pygame Event

一、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()
复制代码

再次重新启动程序,使用上下方向键操作

e8573f9958a940e69a27c2baa1340a53_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif

但是这里还要一个问题,就是当持续按住下方向键时,外星人只会往下移动一次,我们期望的是当连续按下时,外星人可以连续移动,在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既鼠标的位置赋值给外形人的中心位置,外星人会随着鼠标的移动而移动

d15a95a7c5d64da79b2abb9d892c5610_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif

这种处理并不好,只要鼠标晃过都会多外星人的位置有影响,更好的实现是拖动,既按照鼠标按键的情况下对外星人的位置进行移动

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中每一个事件都有一个编号

image.png

事件编号从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()
复制代码

image.png

外星人会每1000ms向下移动


相关文章
|
3月前
|
Python
Python使用pygame播放MP3
Python使用pygame播放MP3
20 0
|
3月前
|
存储 人工智能 算法
使用 Python 和 Pygame 制作游戏:第九章到第十章
使用 Python 和 Pygame 制作游戏:第九章到第十章
54 0
使用 Python 和 Pygame 制作游戏:第九章到第十章
|
4月前
|
定位技术 Python
【python】pygame实现植物大战僵尸小游戏(附源码 有注释)
【python】pygame实现植物大战僵尸小游戏(附源码 有注释)
365 1
|
11天前
|
Python
Python 的异步编程: 解释什么是事件循环(Event Loop)?
事件循环是Python异步编程的关键,它无限循环等待并处理异步任务,协调I/O操作执行顺序,实现并发,提高性能。
12 0
|
17天前
|
存储 定位技术 数据库
【python毕业设计】python基于Pygame的吃金币游戏设计与实现(源码+毕业论文)【独一无二】
【python毕业设计】python基于Pygame的吃金币游戏设计与实现(源码+毕业论文)【独一无二】
|
1月前
|
Python
利用python+pygame重现《黑客帝国》场景
利用python+pygame重现《黑客帝国》场景
16 0
|
3月前
|
机器学习/深度学习 Python
Python “贪吃蛇”游戏,在不断改进中学习pygame编程
Python “贪吃蛇”游戏,在不断改进中学习pygame编程
59 0
Python “贪吃蛇”游戏,在不断改进中学习pygame编程
|
3月前
|
存储 程序员 对象存储
使用 Python 和 Pygame 制作游戏:第六章到第八章
使用 Python 和 Pygame 制作游戏:第六章到第八章
145 0
|
3月前
|
存储 Shell 程序员
使用 Python 和 Pygame 制作游戏:第一章到第五章
使用 Python 和 Pygame 制作游戏:第一章到第五章
65 0

热门文章

最新文章