pygame判断鼠标左键_PyGame开发游戏(2D)03.键盘输入处理

这节介绍如何在PyGame中,获取键盘和鼠标信息。并通过这些信息控制图元的运动。从而实现人机交互效果。

PyGame支持多种输入设备。键盘、鼠标和游戏操纵杆都支持,这里主要介绍键盘的使用。

01.输入设备响应模式

键盘和鼠标都有两种输入响应模式。一种是状态响应模式,另一种是缓冲区轮询模式。举个例子来描述这两种模式的区别。假如我们按下A键,屏幕就打印输出字母‘A’。如果分别用这两种方式实现。效果是这样的。

按下键盘‘A’键
状态响应屏幕只输出一个‘A’
缓冲区轮询只要不松开,屏幕会输出无数个‘A’

状态事件响应模式:指的是按键的按下“DOWN”和释放‘UP’两种状态。这个事件状态只会激活响应一次。不会无休止响应,除非状态改变。

状态缓冲区轮询:系统会把所有按键状态存在一块缓冲区内。只要按下某个键。它对应的键值就一直是‘PRESS’状态。只要这个按键的状态没有改变。这个状态事件会一直触发。

状态事件响应模式适合实现按钮的响应设计。比如按下一个按钮就只会做出一个响应,而不会连续响应;状态缓冲区轮询适合实时交互响应,比如移动物品,子弹发射等。按下发射按钮,只要不松开,子弹一直发射。

02.键盘设备的状态事件响应模式

#包含pygame模块import pygame  #包含pygame.locals模块import pygame.locals  #包含sys系统操作模块import sys  #初始化pygamepygame.init()  #设置应用程序窗口大小canvas2d = pygame.display.set_mode((800,600))  #设置应用程序窗口标签名称pygame.display.set_caption('键盘状态事件响应程序')  #开启游戏循环while True:          #轮询窗口事件    for event in pygame.event.get():              #如果获得关闭程序事件        if event.type== pygame.locals.QUIT:            pygame.quit()   #退出pygame            sys.exit()  #销毁程序         if event.type == pygame.KEYUP:        #当松开键盘时显示松开键值和状态            print(str(event.key) + 'key up')        elif event.type == pygame.KEYDOWN:        #当按下键盘时显示按下键值和状态            print(str(event.key) + 'key down')    #窗口显示内容更新    pygame.display.update()

event.key参数是按下键盘的值,event.type代表按键的状态。按下是KEYDOWN,松开是KEYUP

按键对应event.key的值如下表:

KeyASCII      ASCII   Common NameK_BACKSPACE   \b      backspaceK_TAB         \t      tabK_CLEAR               clearK_RETURN      \r      returnK_PAUSE               pauseK_ESCAPE      ^[      escapeK_SPACE               spaceK_EXCLAIM     !       exclaimK_QUOTEDBL    "       quotedblK_HASH        #       hashK_DOLLAR      $       dollarK_AMPERSAND   &       ampersandK_QUOTE               quoteK_LEFTPAREN   (       left parenthesisK_RIGHTPAREN  )       right parenthesisK_ASTERISK    *       asteriskK_PLUS        +       plus signK_COMMA       ,       commaK_MINUS       -       minus signK_PERIOD      .       periodK_SLASH       /       forward slashK_0           0       0K_1           1       1K_2           2       2K_3           3       3K_4           4       4K_5           5       5K_6           6       6K_7           7       7K_8           8       8K_9           9       9K_COLON       :       colonK_SEMICOLON   ;       semicolonK_LESS        <       less-than signK_EQUALS      =       equals signK_GREATER     >       greater-than signK_QUESTION    ?       question markK_AT          @       atK_LEFTBRACKET [       left bracketK_BACKSLASH   \       backslashK_RIGHTBRACKET ]      right bracketK_CARET       ^       caretK_UNDERSCORE  _       underscoreK_BACKQUOTE   `       graveK_a           a       aK_b           b       bK_c           c       cK_d           d       dK_e           e       eK_f           f       fK_g           g       gK_h           h       hK_i           i       iK_j           j       jK_k           k       kK_l           l       lK_m           m       mK_n           n       nK_o           o       oK_p           p       pK_q           q       qK_r           r       rK_s           s       sK_t           t       tK_u           u       uK_v           v       vK_w           w       wK_x           x       xK_y           y       yK_z           z       zK_DELETE              deleteK_KP0                 keypad 0K_KP1                 keypad 1K_KP2                 keypad 2K_KP3                 keypad 3K_KP4                 keypad 4K_KP5                 keypad 5K_KP6                 keypad 6K_KP7                 keypad 7K_KP8                 keypad 8K_KP9                 keypad 9K_KP_PERIOD   .       keypad periodK_KP_DIVIDE   /       keypad divideK_KP_MULTIPLY *       keypad multiplyK_KP_MINUS    -       keypad minusK_KP_PLUS     +       keypad plusK_KP_ENTER    \r      keypad enterK_KP_EQUALS   =       keypad equalsK_UP                  up arrowK_DOWN                down arrowK_RIGHT               right arrowK_LEFT                left arrowK_INSERT              insertK_HOME                homeK_END                 endK_PAGEUP              page upK_PAGEDOWN            page downK_F1                  F1K_F2                  F2K_F3                  F3K_F4                  F4K_F5                  F5K_F6                  F6K_F7                  F7K_F8                  F8K_F9                  F9K_F10                 F10K_F11                 F11K_F12                 F12K_F13                 F13K_F14                 F14K_F15                 F15K_NUMLOCK             numlockK_CAPSLOCK            capslockK_SCROLLOCK           scrollockK_RSHIFT              right shiftK_LSHIFT              left shiftK_RCTRL               right controlK_LCTRL               left controlK_RALT                right altK_LALT                left altK_RMETA               right metaK_LMETA               left metaK_LSUPER              left Windows keyK_RSUPER              right Windows keyK_MODE                mode shiftK_HELP                helpK_PRINT               print screenK_SYSREQ              sysrqK_BREAK               breakK_MENU                menuK_POWER               powerK_EURO                Euro

如果我们要判断是否按下A键,输入以下代码:

if event.key == pygame.K_a:    #相应处理指令

这里游戏,按键是不区分大小写的。


03.键盘设备的缓冲区轮询响应模式

在系统内部有一块缓冲区,里面记录了所有键值的状态,按下还是释放。用户通过pygame.key.get_pressed()函数访问缓冲区相应键位才可知道当前状态。

#包含pygame模块import pygame   #包含pygame.locals模块import pygame.locals   #包含sys系统操作模块import sys   #初始化pygamepygame.init()   #设置应用程序窗口大小canvas2d = pygame.display.set_mode((800,600))   #设置应用程序窗口标签名称pygame.display.set_caption('hello')   #开启游戏循环while True:           #轮询窗口事件    for event in pygame.event.get():               #如果获得关闭程序事件        if event.type== pygame.locals.QUIT:            pygame.quit()   #退出pygame            sys.exit()  #销毁程序                 #注意:这里键盘信息获取是放在for事件轮询外面的    key_buf = pygame.key.get_pressed()    if key_buf[pygame.K_a]==1:        print('key A is press')    elif key_buf[pygame.K_b]==1:        print('key B is press')    #窗口显示内容更新    pygame.display.update()

以上程序运行时,按下A键就输出多行“key A is press”。按下B键就输出多行“key B is press”。为什么是输出多行呢?是因为,只要按键还是按下状态,相对应的处理命令就一直会执行,这个过程是很快的。除非按下状态取消。


b1030491d171e067d508f79d9d02aee0.png

关注我们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值