来源

本例中的代码来自UP主@nearron的SetKey类相关视频。
视频地址:https://www.bilibili.com/video/BV13U4y1U7W3?spm_id_from=333.999.0.0

源码

  1. extends Node
  2. var keyMapData:Dictionary ={}
  3. # 初始化,用代码快速创建Action和按键
  4. func init():
  5. add_keymap("上","1")
  6. add_keymap("上",[KEY_W])
  7. #add_keymap("下",[KEY_s])
  8. #add_keymap("左",[KEY_A])
  9. #add_keymap("右",[KEY_D])
  10. # 添加一个Action,并设置一个或多个按键
  11. # @param action 要新建的动作的名称
  12. # @param keyList 一个或多个按键
  13. # 单个按键可传入单个按键常数
  14. # 多个按键可传入包含多个按键常数的数组
  15. func add_keymap(action:String,keyList):
  16. #新增一个相应字典,并为其添一个加初始按键
  17. if !keyMapData.get(action):
  18. InputMap.add_action(action,0.8)
  19. if typeof(keyList)=TYPE_ARRAY:
  20. append_keys(action,keyList)
  21. elif typeof(keyList)=TYPE_INT:
  22. append_key(action,keyList)
  23. else:
  24. print("输入类型错误\n",typeof(keyList),"并不是所需要的值")
  25. # 检测InputMap中是否已经存在指定的Action
  26. # 如果存在同名Action,删除原来的Action
  27. # 否则直接添加Action
  28. func init_keymap(action:String,keylist:Array)
  29. var actionList = InputMap.get_actions()
  30. if action in actionList:
  31. InputMap.action_erase_events(action)
  32. else:
  33. InputMap.add_action(action)
  34. append_keys(action,keylist)
  35. #向已有的相应字典中中添加一个按键
  36. func append_key(action:String,key:int )
  37. if keyMapData.get(action)
  38. if key in keyMapData[action]:
  39. return
  40. else:
  41. keyMapData[action].append(key)
  42. else:
  43. keyMapData[action] = [key]
  44. var myKey InputEventKey.new()
  45. myKey.scancode = key
  46. InputMap.action_add_event(action,myKey)
  47. #为相应字典批量添加按键
  48. func append_keys(action:String,keylist:Array )
  49. for key in keylist:
  50. append_key(action,key)
  51. #打印当前的展示整个keyMapData字典
  52. func show_keymap():
  53. print(keyMapData)

可以看到这是一个很好的思路,将InputMap和相关的Action、Event操作封装起来。自动加载后,就可以全局使用。
只是代码可能不够简洁,