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向下移动


相关文章
|
5天前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
2月前
|
Python
源码解密 Python 的 Event
源码解密 Python 的 Event
43 1
|
2月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
74 0
|
4月前
|
定位技术 Python
【python】python基于pygame坦克大战游戏设计(源码+图像+操作说明)【独一无二】
【python】python基于pygame坦克大战游戏设计(源码+图像+操作说明)【独一无二】
|
4月前
|
Linux iOS开发 MacOS
【Python】Python基于Pygame疯狂赛车游戏设计(源码+报告)【独一无二】
【Python】Python基于Pygame疯狂赛车游戏设计(源码+报告)【独一无二】
|
4月前
|
JSON 数据格式 Python
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
|
5月前
|
存储 Python
离散事件模拟(Discrete Event Simulation)详解与Python代码示例
离散事件模拟(Discrete Event Simulation)详解与Python代码示例
|
4月前
|
Python
【python】python基于pygame弹珠游戏设计(源码)【独一无二】
【python】python基于pygame弹珠游戏设计(源码)【独一无二】
|
4月前
|
算法 数据安全/隐私保护 UED
【python】python基于Pygame扫雷游戏设计实现(源码+报告)【独一无二】
【python】python基于Pygame扫雷游戏设计实现(源码+报告)【独一无二】
|
6月前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
147 1