Pygame Event事件模块(详细示例)

事件(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] -= 8if event.key == pygame.K_DOWN:site[1] += 8if event.key == pygame.K_LEFT:site[0] -= 8if event.key == pygame.K_RIGHT:site[0] += 8# 移动图像position = position.move(site)# 填充背景screen.fill(bg)# 放置图片screen.blit(img, position)# 更新显示界面pygame.display.flip()

处理鼠标事件

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

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

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

import pygame
from random import randint
# 初始化程序
pygame.init()
screen = pygame.display.set_mode((450,400))
pygame.display.set_caption("c语言中文网")
# 更新显示
pygame.display.flip()
while True:#等待事件发生event = pygame.event.wait()if event.type == pygame.QUIT:exit("成功退出")if event.type == pygame.MOUSEBUTTONDOWN:# pos 获取鼠标当前位置print('鼠标按下',event.pos)mx,my = event.pos# 调用 pygame.draw 模块画圆pygame.draw.circle(screen,(255,255,0),(mx,my),50)# 处理完,更新显示pygame.display.update()if event.type == pygame.MOUSEBUTTONUP:print('鼠标弹起')passif event.type == pygame.MOUSEMOTION:print('鼠标移动')mx, my = event.pos# 随机生成 RGB 颜色值r = randint(0,255)g = randint(0,255)b = randint(0,255)pygame.draw.circle(screen, (r,g,b,),(mx, my), 50)# 处理完,更新显示pygame.display.update()

Pygame Event事件模块(详细示例)相关推荐

  1. Pygame Event事件模块(示例)

    Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...

  2. PYGAME - Event 事件

    pygame.event 用于处理事件与事件队列的 Pygame 模块. 函数 pygame.event.pump()  -  让 Pygame 内部自动处理事件 pygame.event.get() ...

  3. (一)pygame.event详细解析

    文章目录 pygame.event详细解析 函数表 **函数详解** **pygame.event.pump()** **pygame.event.get()** **pygame.event.pol ...

  4. jquery源码分析(七)——事件模块 event(二)

    上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...

  5. eventemitter_节点JS事件模块和EventEmitter

    eventemitter We have already discussed in previous posts about Node JS Architecture. Node JS follows ...

  6. Python pygame(GUI编程)模块最完整教程(1)

    提示:下滑文章左侧可以查看目录! 1 初识pygame 1.1 简介 参考资料:About - pygame wiki pygame是python中一个流行的GUI编程模块,是专门为了开发游戏而设计的 ...

  7. pygame中draw模块方法详解

    目录 pygame.draw.rect() pygame.draw.polygon() pygame.draw.circle() pygame.draw.ellipse() pygame.draw.a ...

  8. jQuery源码分析系列:事件模块概述

    jQuery的事件模块是较复杂的,前面仅仅提到了对事件对象的包装.即统一了一些兼容性的问题.这篇会综述下jQuery的整个事件模块.后面会详细分析jQuery.event.add/jQuery.eve ...

  9. 聊聊LiteOS事件模块的结构体、初始化及常用操作

    本文分享自华为云社区<LiteOS内核源码分析系列九 事件Event>,原文作者:zhushy . 事件(Event)是一种任务间通信的机制,可用于任务间的同步.多任务环境下,任务之间往往 ...

最新文章

  1. python argparse库_Python的argparse库使用详解
  2. 80页笔记看遍机器学习基本概念、算法、模型,帮新手少走弯路
  3. petshop4.0 具体解释之中的一个(系统架构设计)
  4. openjdk需要自己添加cacerts,
  5. Machine Learning 网络资源
  6. 透视大数据时代下的物联网生活
  7. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例
  8. python极客项目编程_Python极客项目编程 ([美]Mahesh Venkitachalam) 中文pdf完整版
  9. 开发外包注意事项——iOS APP的开发
  10. Hadoop学习笔记—15.HBase框架学习(基础知识篇)
  11. 聊聊Lambda架构
  12. winform 图片集合
  13. fg jobs bg
  14. [转载] 【Python】向json文件中追加新的对象
  15. Error: Could not link: /usr/local/share/doc/homebrew
  16. python正则表达式应用
  17. 红蜘蛛多媒体网络教室v7.2版一款网络教学的软件_我是亲民_新浪博客
  18. 选择IT行业的自我心得,希望能帮助到各位!(一)
  19. 碳足迹计算2021-02-06
  20. 酒店客房管理系统(JAVA,JSP,SERVLET,MYSQL)

热门文章

  1. CSS3详解:text-shadow
  2. 运行微信小程序出现的问题
  3. Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售智能业务对话机器人配置详解与Debugging演示(八十七)
  4. POJ - Euclid(计算几何)
  5. pymongo count和count_documents效率对比
  6. 群晖第一篇-硬件装机
  7. 20155323刘威良 《信息安全系统设计基础》课程总结
  8. 2010 年一月联考逻辑真题
  9. 淡然而不漠然,幸福才不会擦肩!
  10. 宏(macro)定义与使用