更新时间:2022年07月26日16时55分 来源:传智教育 浏览次数:
游戏需要与玩家交互,因此它必须能够接收玩家的操作,并根据玩家操作有针对性地做出响应。程序开发中将玩家会对游戏进行的操作称为事件(Event),根据输入媒介的不同,游戏中的事件分为键盘事件、鼠标事件和手柄事件等。pygame在子模块locals中对事件进行了更加细致的定义,键盘事件、鼠标事件及其产生途径和参数如下表所示。
由表上表可知,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)> 点击了方块 点击了按钮 点击了空白区域 退出游戏 ← → ↑ ↓
此处的示例仅为展示游戏开发中的事件处理流程,并未详细讲解如何选择要处理的事件以及事件的详细处理,皆因需求决定程序走向,程序代码总是与程序的功能息息相关。