Python游戏开发入门:pygame事件处理机制-3

简介: Python游戏开发入门:pygame事件处理机制-3

Pygame事件处理机制简介

• 键盘事件及类型的使用
• 鼠标事件及类型的使用
• Pygame事件处理函数

Pygame事件队列


缓存并派发所有事件
原则上先到先处理
用户对事件逐一处理

Pygame事件

pygame.event.EventType
• 事件本质上是一种封装后的数据类型(对象)
• EventType是Pygame的一个类,表示事件类型
• 事件类型只有属性,没有方法
• 用户可自定义新的事件类型


image.png

image.png

实例:键盘落下事件及属性


pygame.event.KEYDOWN
event.unicode
• event.key
• event.mod

键盘事件及属性


键盘按下事件pygame.event.KEYDOWN
键盘释放事件pygame.event.KEYUP
event.unicode  按键的unicode码,平台有关,不推荐使用
event.key 按键的常量名称
event.mod  按键修饰符的组合值

按键的常量名称


K_BACKSPACE
K_TAB
K_CLEAR
K_RETURN
K_PAUSE
K_ESCAPE
K_SPACE
K_EXCLAIM
K_QUOTEDBL
K_HASH
K_COLON
K_SEMICOLON
K_LESS
K_EQUALS
K_GREATER
K_QUESTION
K_AT
K_LEFTBRACKET
K_BACKSLASH
K_RIGHTBRACKET
K_CARET
K_0
K_1
K_2
K_3
K_4
K_5
K_6
K_7
K_8
K_9
K_DOLLAR
K_AMPERSAND
K_QUOTE
K_LEFTPAREN
K_RIGHTPAREN
K_ASTERISK
K_PLUS
K_COMMA
K_MINUS
K_PERIOD
K_SLASH
K_UNDERSCORE
K_BACKQUOTE
K_DELETE
K_UP
K_DOWN
K_RIGHT
K_LEFT
K_INSERT
K_HOME
K_END
K_KP0
K_KP1
K_KP2
K_KP3
K_KP4
K_KP5
K_KP6
K_KP7
K_KP8
K_KP9
K_KP_PERIOD
K_KP_DIVIDE
K_KP_MULTIPLY
K_KP_MINUS
K_KP_PLUS
K_KP_ENTER
K_KP_EQUALS
K_PAGEUP
K_PAGEDOWN
K_NUMLOCK
K_F1
K_F2
K_F3
K_F4
K_F5
K_F6
K_F7
K_F8
K_F9
K_F10
K_F11
K_F12
K_F13
K_F14
K_F15
K_CAPSLOCK
K_SCROLLOCK
K_RSHIFT
K_LSHIFT
K_RCTRL
K_LCTRL
K_RALT
K_LALT
K_RMETA
K_LMETA
K_LSUPER
K_RSUPER
K_MODE
K_HELP
K_PRINT
K_SYSREQ
K_BREAK
K_MENU
K_POWER
K_EURO
K_a
K_b
K_c
K_d
K_e
K_f
K_g
K_h
K_i
K_j
K_k
K_l
K_m
K_n
K_o
K_p
K_q
K_r
K_s
K_t
K_u
K_v
K_w
K_x
K_y
K_z

按键的修饰符


KMOD_NONE
KMOD_LSHIFT
KMOD_RSHIFT
KMOD_SHIFT
KMOD_CAPS
KMOD_LCTRL
KMOD_RCTRL
KMOD_CTRL
KMOD_LALT
KMOD_RALT
KMOD_ALT
KMOD_LMETA
KMOD_RMETA
KMOD_META
KMOD_NUM
KMOD_MODE

修饰符的按位或运算


event.mod = KMOD_ALT | KMOD_SHIFT

鼠标事件及属性


pygame.event.MOUSEMOTION鼠标移动事件
    event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
    event.rel 鼠标相对运动距离(X,Y),相对于上次事件
    event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
pygame.event.MOUSEBUTTONUP鼠标键释放事件
    event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
    event.button 鼠标按下键编号n取值 0/1/2,分别对应三个键
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
    event.pos  鼠标当前坐标值(x,y),相对于窗口左上角
    event.button 鼠标按下键编号n取值为整数,左键为1,右键为3,设备相关

事件处理的重要函数


处理事件
    pygame.event.get(type/typelist) 
    从事件队列中获得事件列表,即获得所有被队列的事件
    pygame.event.poll()  
    从事件队列中获得一个事件,事件获取将从事件队列中删除
    pygame.event.clear(type/typelist)  
    从事件队列中删除事件,默认删除所有事件
    如果事件队列为空,则返回 event.NOEVENT
操作事件队列
    同时仅能存储128个事件当队列满时,更多事件将被丢弃
    设置事件队列能够缓存事件的类型
    pygame.event.set_blocked(type or typelist)  
    控制哪些类型事件不允许被保存到事件队列中
    pygame.event.get_blocked(type) 
    测试某个事件类型是否被事件队列所禁止
    如果事件类型被禁止,则返回True,否则返回False
    pygame.event.set_allowed(type or typelist)
    控制哪些类型事件允许被保存到事件队列中

生成事件


pygame.event.post(Event)
产生一个事件,并将其放入事件队列
一般用于放置用户自定义事件(pygame.USEREVENT)
也可以用于放置系统定义事件(如鼠标或键盘等),给定参数
  pygame.event.Event((type, dict) 创建一个给定类型的事件
其中,事件的属性和值采用字典类型复制,属性名采用字符串形式
如果创建已有事件,属性需要一致

代码示例

处理事件

# -*- coding: utf-8 -*-
# @File    : pygame_demo.py
# @Date    : 2018-05-22
"""
键盘鼠标事件
"""
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("pygame游戏之旅")
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        # 监听键盘按下事件,打印出所按的键位信息
        if event.type == pygame.KEYDOWN:
            if event.unicode =="":
                print("#", event.key, event.mod)
            else:
                print(event.unicode, event.key, event.mod)
        # 监听鼠标事件,打印鼠标位置信息
        elif event.type == pygame.MOUSEMOTION:
            print("MOUSEMOTION", event.pos, event.rel, event.buttons)
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print("MOUSEBUTTONDOWN", event.pos, event.button)
        elif event.type == pygame.MOUSEBUTTONUP:
            print("MOUSEBUTTONUP", event.pos, event.button)
    pygame.display.update()

产生事件

 
         
相关文章
|
3天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
3天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
15 3
|
5天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
6月前
|
存储 安全 Java
解释Python中的引用和赋值机制。
Python中,变量是对象引用,不存储数据,而存数据在内存的位置。赋值(=)创建变量并让其指向内存中的对象。当多个变量指向同一对象时,它们共享引用。Python使用引用计数管理对象生命周期,对象引用为0时回收。了解这些机制对优化内存使用和防止内存泄漏很重要。例如: ```markdown ```python a = 5 b = a # b引用了同一数字5 del a # 数字5的引用计数仍为1,未被回收 ``` 引用计数并非唯一机制,Python还采用其他策略处理循环引用等复杂情况。
54 2
|
5月前
|
存储 安全 Java
在Python中,引用和赋值机制是理解变量和数据对象之间关系的关键
【6月更文挑战第16天】Python变量是对象引用,不存储数据,指向内存中的对象。赋值`=`创建引用,不复制对象。`b = a`时,a和b指向同一对象。引用计数管理对象生命周期,垃圾回收在引用数为0时回收对象。理解这些机制对优化内存使用关键。
55 7
|
6月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
63 6
|
Python
(7)Python赋值机制
 知识在于点滴积累
835 0
|
5天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####