Pygame Event事件模块的详细示例


Posted in Python onNovember 17, 2021

事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等等,这些都可以看做是“事件”,Pygame 会接受用户产生的各种操作(或事件),这些操作随时产生,并且操作量可大可小,那么 Pygame 是如何处理这些事件的呢?

事件类型

Pygame 定义了一个专门用来处理事件的结构,即事件队列,该结构遵循遵循队列“先到先处理”的基本原则,通过事件队列,我们可以有序的、逐一的处理用户的操作(触发事件)。下述表格列出了 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 触发一个用户事件   事件代码

注意,当使用 Pygame 做游戏开发时,上述事件并非都会应用的到,因此在学习的过程中,我们要懂得触类旁通、举一反三。

事件处理方法

Pygame.event 模块提供了处理事件队列的常用方法,如下表所示:

 

方法 说明
pygame.event.get() 从事件队列中获取一个事件,并从队列中删除该事件
pygame.event.wait()  阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态
pygame.event.set_blocked()  控制哪些事件禁止进入队列,如果参数值为None,则表示禁止所有事件进入
pygame.event.set_allowed()   控制哪些事件允许进入队列
pygame.event.pump()  调用该方法后,Pygame 会自动处理事件队列
pygame.event.poll()  会根据实际情形返回一个真实的事件,或者一个None
pygame.event.peek()   检测某类型事件是否在队列中
pygame.event.clear() 从队列中清除所有的事件
pygame.event.get_blocked()  检测某一类型的事件是否被禁止进入队列
pygame.event.post()   放置一个新的事件到队列中
pygame.event.Event()   创建一个用户自定义的新事件

当我们使用 Pygame 处理事件时,逻辑一般都是相似的。首先是判断事件的类型,然后根据不同的事件操作,执行不同的游戏操作。因此这种情况非常适合使用 if ... else 语句。如下所示:

while True:
    #等待事件发生
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit()
    if event.type == pygame.MOUSEBUTTONDOWN:
        print('鼠标按下',event.pos)
    if event.type == pygame.MOUSEBUTTONUP:
        print('鼠标弹起')
    if event.type == pygame.MOUSEMOTION:
        print('鼠标移动')
        # 键盘事件
    if event.type ==pygame.KEYDOWN:
        # 打印按键的英文字符
        print('键盘按下',chr(event.key))
    if event.type == pygame.KEYUP:
        print('键盘弹起')
    ....

下面应用上述方法对鼠标事件和键盘事件分别做简单的介绍。

处理键盘事件

键盘事件会涉及到大量的按键操作,比如游戏中的上下左右,或者人物的前进、后退等操作,这些都需要键盘来配合实现。

键盘事件提供了一个 key 属性,通过该属性可以获取键盘的按键。Pygame 将键盘上的字母键、数字键、组合键等按键以常量的方式进行了定义,下表列出了部分常用按键的常量:

 

常量名 描述
K_BACKSPACE 退格键(Backspace)
K_TAB 制表键(Tab)
K_CLEAR 清除键(Clear)
K_RETURN 回车键(Enter)
K_PAUSE 暂停键(Pause)
K_ESCAPE 退出键(Escape)
K_SPACE 空格键(Space)
K_0...K_9 0...9
K_a...Kz a...z
K_DELETE 删除键(delete)
K_KP0...K_KP9 0(小键盘)...9(小键盘)
K_F1...K_F15 F1...F15
K_UP 向上箭头(up arrow)
K_DOWN 向下箭头(down arrow)
K_RIGHT 向右箭头(right arrow)
K_LEFT 向左箭头(left arrow)
KMOD_ALT 同时按下Alt键

想要了解更多按键常量可参考官方文档,这里有您想要的更多知识 ———> 点击前往

下面通过“图片移动”示例来了解键盘事件的处理过程,如下所示:

import pygame
import sys
# 初始化pygame
pygame.init()
# 定义变量
size = width, height = 600, 400
bg = (255, 255, 255)
# 加载logo图
img = pygame.image.load("C:/Users/Administrator/Desktop/logo.jpg")
# 获取图像的位置
position = img.get_rect()
# 创建一个主窗口
screen = pygame.display.set_mode(size)
# 标题
pygame.display.set_caption("C语言中文网")
# 创建游戏主循环
while True:
    # 设置初始值
    site = [0, 0]
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        # 图像移动 KEYDOWN 键盘按下事件
        # 通过 key 属性对应按键
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                site[1] -= 8
            if event.key == pygame.K_DOWN:
                site[1] += 8
            if event.key == pygame.K_LEFT:
                site[0] -= 8
            if event.key == pygame.K_RIGHT:
                site[0] += 8
    # 移动图像
    position = position.move(site)
    # 填充背景
    screen.fill(bg)
    # 放置图片
    screen.blit(img, position)
    # 更新显示界面
    pygame.display.flip()

程序运行结果如下:

Pygame Event事件模块的详细示例

图1:Pygame键盘事件——图像移动

处理鼠标事件

鼠标是计算机最重要外接设备之一,同时它也是游戏玩家必不可少的工具之一。

Pygame 提供了三个鼠标事件,分别是鼠标移动(MOUSEMOTION)、鼠标按下(MOUSEBUTTONDOWN)、鼠标释放(MOUSEBUTTONUP),不同事件类型对应着不同的成员属性。如下所示:

pygame.event.MOUSEMOTION鼠标移动事件

    event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
    event.rel 鼠标相对运动距离(X,Y),相对于上次事件
    event.buttons 鼠标按钮初始状态(0,0,0),分别对应(左键,滑轮,右键),移动过程中点击那个键,相应位置变会为1

pygame.event.MOUSEBUTTONUP鼠标键释放事件

    event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
    event.button 鼠标释放键编号(整数)左键为1,按下滚动轮2、右键为3

pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件

    event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
    event.button 鼠标按下键编号(整数),左键为1,按下滚动轮2、右键为3,向前滚动滑轮4、向后滚动滑轮5

通过一组简单的示例对鼠标事件进行演示,示例代码如下:

程序运行结果如下:

Pygame Event事件模块的详细示例

图2:Pygame鼠标事件——鼠标移动

到此这篇关于Pygame Event事件模块的详细示例的文章就介绍到这了,更多相关Pygame Event内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
Python自动登录126邮箱的方法
Jul 10 Python
Python实现自动登录百度空间的方法
Jun 10 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
Django给admin添加Action的步骤详解
May 01 Python
python 日期排序的实例代码
Jul 11 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
python字符串判断密码强弱
Mar 18 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
利用python做数据拟合详情
Python Matplotlib库实现画局部图
Nov 17 #Python
python实现局部图像放大
Pygame Draw绘图函数的具体使用
Pygame Rect区域位置的使用(图文)
Nov 17 #Python
分析Python list操作为什么会错误
Nov 17 #Python
深入理解Pytorch微调torchvision模型
Nov 11 #Python
You might like
C# Assembly类访问程序集信息
2009/06/13 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
浅谈React高阶组件
2018/03/28 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
简单介绍Python中的try和finally和with方法
2015/05/05 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
微信小程序python用户认证的实现
2019/07/29 Python
python支付宝支付示例详解
2019/08/22 Python
python数据化运营的重要意义
2019/11/25 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
linux面试题参考答案(7)
2014/07/24 面试题
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
大学生通用个人自我评价
2014/04/27 职场文书
入党积极分子评语
2014/05/04 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
社区母亲节活动总结
2015/02/10 职场文书
公司员工奖惩制度
2015/08/04 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android