首页常见问题正文

Python培训:pygame事件处理机制详解

更新时间:2022-12-22 来源:黑马程序员 浏览量:

IT培训班

游戏需要与玩家交互,因此它必须能够接收玩家的操作,并根据玩家操作有针对性地做出响应。程序开发中将玩家会对游戏进行的操作称为事件(Event),根据输入媒介的不同,游戏中的事件分为键盘事件、鼠标事件和手柄事件等。pygame在子模块locals中对事件进行了更加细致的定义,键盘事件、鼠标事件及其产生途径和参数如下表所示。

pygame产生背景

由表上表可知,pygame.locals中的键盘事件分为KEYDOWN和KEYUP.这两个事件的参数描述如下。

(1)unicode:记录按键的Unicode值。

(2)key:按下或放开的键的键值,键值是一个数字,但为了方便使用,pygame中支持以K_xx来表示按键,例如,字母键表示为K_a、K_b等,方向键表示为K_UP、K_DOWN、K_LEFT、K_RIGHT,ESC键表示为K_ESCAPE(更多按键表示请参见pygame手册)。

(3)mod:包含组合键信息,例如mod&KMOD_CTRL为真,表示用户在按下其他键的同时按下了Ctrl键。类似的还有KMOD_SHIFT、KMOD_ALT。

Pygame.locals中的鼠标事件分为MOUSEMOTION、MOUSEBUTTONDOWN、MOU SEBUTTONUP,这3个事件的参数描述如下。

(l)pos:鼠标操作的位置,该参数是一个包含横坐标x和纵坐标y的元组。

(2)rel:当前位置与上次产生鼠标事件时鼠标指针位置间的距离。

(3)buttons:一个含有3个数字的元组,元组中数字的取值只能为0或1,3个数字依次表示左键、滚轮和右键。若仅移动鼠标,则buttons的值为(1,0,0);若鼠标移动的同时单击鼠标的某个按键,元组中与该键对应的值更改为1,例如按下鼠标左键,buttons的值为(1,0,0)。

(4)button:整型数值,1表示单击鼠标左键,2表示单击滚轮,3表示单击右键,4表示向上滑动滚轮,5表示向下滑动滚轮。

程序可通过pygame子模块event中的type属性判断事件类型,通过get()函数获取当前时刻产生的所有事件的列表。当然,并非事件列表中的事件都需要关心和处理,程序通常在循环中遍历事件列表,将其中的元素与需要处理的事件常量进行比对,若当前事件为需要处理的事件,再对其进行相应操作。

在程序7_pg_test.py中添加事件处理代码,具体如下所示:

````
#获取点击事件,rect.collodepoint(),判断点击位置
while True:
    FPSCLOCK.tick (FPS)
    for event in pygame.event.get():
         if event.type == MOUSEBUTTONUP:            #如果有鼠标放开事件
             if blockRect.collidepoint(event.pos): #净如果点击的是方块
                 print('点击了方块')
             elif autoRect.collidepoint (event.pos):
                 print('点击了按钮')
             else:
                 print('点击了空白区域')
elif event.type == KEYUP:#如果有按键放开事件
             if event.key in (K_LEFT,K_a):
                 print('←')
             elif event.key in (K_RIGHT, K_d):
                 print('→')
             elif event.key in (K_UP, K_w):
                 print('↑')
             elif event.key in (K_DOWN, K_s):
                 print('↓')
             elif event.key ==K_ESCAPE:
                 print('退出游戏')
                 pygame.quit()
pygame.quit()

以上代码在while循环中通过for 循环遍历事件,对每层for循环取出的事件event进行判断,若当前事件为鼠标放开事件(MOUSEBUTTONUP),说明鼠标按键曾被按下,此时使用Rect类的collidepoint()方法判断点击的位置event.pos与方块、按钮的关系,输出相应信息;若当前事件为按键放开事件(KEYUP),说明键盘按键曾被按下,此时根据event.key属性判断曾被按下的具体按键,根据按键打印相应的信息,或退出程序。执行程序,依次执行循环中的判断条件,程序打印结果如下:

·pypygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html
<rect (290, 210, 60, 60)>
点击了方块
点击了按钮
点击了空白区域
退出游戏
←
→
↑
↓

此处的示例仅为展示游戏开发中的事件处理流程,并未详细讲解如何选择要处理的事件以及事件的详细处理,皆因需求决定程序走向,程序代码总是与程序的功能息息相关。

分享到:
在线咨询 我要报名
和我们在线交谈!