您当前的位置: 首页 >  游戏

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

彭世瑜 发布时间:2018-05-25 21:41:09 ,浏览量: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()
关注
打赏
1688896170
查看更多评论

彭世瑜

暂无认证

  • 3浏览

    0关注

    2727博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1035s