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] -= 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

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

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('鼠标弹起')
        pass

    if 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鼠标事件
图2:Pygame鼠标事件——鼠标移动

关注公众�「站长严长生�,在手机上阅读所有教程,�时�地都能学习。本公众�由C语言中文网站长亲自��,长期更新,��原创。

公众�二维�
微信扫�关注公众�

 

加入微信交�群,一起学习�枯燥。内�一款�索神器,�费下载全网书�和视频。