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

Pygame事件处理机制简介

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

Pygame事件队列

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

Pygame事件

pygame.event.EventType
• 事件本质上是一种封装后的数据类型(对象)
• EventType是Pygame的一个类,表示事件类型
• 事件类型只有属性,没有方法
• 用户可自定义新的事件类型
事件类型 对应常量
系统 QUIT(none),
系统 ACTIVEEVENT(gain, state)
键盘 KEYDOWN(unicode, key, mod)
键盘 KEYUP(key, mod)
鼠标 MOUSEMOTION(pos, rel, buttons)
鼠标 MOUSEBUTTONUP(pos, button)
鼠标 MOUSEBUTTONDOWN(pos, button)
游戏杆 JOYAXISMOTION(joy, axis, value)
游戏杆 JOYBALLMOTION joy, ball, rel
游戏杆 JOYHATMOTION joy, hat, value
游戏杆 JOYBUTTONUP joy, button
游戏杆 JOYBUTTONDOWN joy, button
窗口 VIDEORESIZE size, w,h
窗口 VIDEOEXPOSE none
用户定义 USEREVENT code

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

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()

产生事件

# -*- 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游戏之旅")
fps = 1
fclock = pygame.time.Clock()
num = 1

while True:
    # 生成事件并插入事件队列
    uevent = pygame.event.Event(
        pygame.KEYDOWN,
        {"unicode": 123, "key": pygame.K_SPACE, "mod": pygame.KMOD_LALT}
    )
    pygame.event.post(uevent)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":
                print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
            else:
                print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)

    pygame.display.update()

猜你喜欢

转载自blog.csdn.net/mouday/article/details/80457220