《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。
1 键盘事件
玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应的事件是KEYUP。监听键盘按键,对这两个事件中的一个进行监听即可。
当玩家点击了键盘上的某个按键后,KEYDOWN和KEYUP事件就会被系统加入到事件队列中;接下来游戏程序从系统的事件队列中取出事件,如果是KEYDOWN和KEYUP事件,则继续判断玩家点击了键盘中的哪个按键,最后游戏程序对不同的按键进行不同的处理,流程如图1所示。
图1 监听键盘按键的流程
2 监听按键的代码实现
2.1 判断按键是否被按下
当从事件队列中获取到KEYDOWN或KEYUP事件,则说明按键被按下,代码如图2所示。
图2 判断按键是否被按下的代码
其中,第15行代码中的elif对事件类型event.type进行判断,如果是KEYDOWN,则说明此时有按键被按下。
注意1 KEYDOWN在pygame.locals中定义。
注意2 也可以监听KEYUP事件。
2.2 判断哪个按键被按下
当监听到玩家按下了按键后,接下来就要判断玩家按下了哪个按键,可以通过两种方法进行判断。
2.2.1 通过按键ID进行判断
通过按键ID进行判断的代码如图3所示。
图3 通过按键ID进行判断的代码
从图3中可以看出,event.key表示按键ID,通过if...elif对event.key的值进行判断,不同取值表示玩家按下了不同的按键,则进行不同的处理。
相关链接1 K_ESCAPE对应Esc按键;K_0~K_9分别对应0-9按键;K_a~K_z分别对应a~z按键;KEY_UP、KEY_DOWN、KEY_LEFT和KEY_RIGHT分别对应上下左右按键。
2.2.2 通过按键名进行判断
通过按键名进行判断的代码如图4所示。
图4 通过按键名进行判断的代码
其中,第16行代码通过pygame.key.name()函数获取到了按键ID对应的按键名,该按键名是字符串类型,保存在变量key_name中;接下来的17-25行代码对按键名key_name进行判断,不同的按键名进行不同的处理。
2.3 按键长按与短按的处理
在某些游戏中,会将长按按键和短按按键设置为不同的功能。可以通过如图5所示的代码进行设置,使得pygame能够重复地响应一个持续被按下的键。
图5 设置pygame能够重复地响应持续按下的键
该函数的参数是一个以毫秒为单位的值,表示第一个KEYDOWN事件在等待10毫秒后,被送到事件队列中。
相关链接2 pygame.key.set_repeat()函数还可以包含第二个参数,第二个参数也是一个以毫秒为单位的值,表示之后的KEYDOWN事件被送到事件队列中的间隔时间。