Godot 3.4

组合键,连招时对按键的判定,实现代码。底部有使用的示例文件

关键代码:

#==================================================
#   Componse Input - 组合输入
#==================================================
# * 延迟判断按键是否被按下,防止操作过于快速导致组合键失效
# * 例,按下:小键盘方向键左+空格,则触发操作:
#   add_mapper(
#       "刺"
#       , ["ui_accept", "ui_left", "ui_right"]    # 包含的组合键
#       , ["ui_accept"]       # 在按下的一刻才被检测到的键
#       , ["ui_left", "ui_right"]   # 其中的一个键被检测到则这个数组内的按钮都算作被检测到
#   )
#==================================================
# @datetime: 2021-12-21 22:50:05
#==================================================extends Node# 每个按键组合会在其中一个按键被触发时进行计时器倒计时
# 进行组合件判定,如果到达时间,则会进行释放掉所有已按
# 下的记录,会在此进行发出释放掉的按键,以便可以连接这
# 个信号去执行其他可能的操作
## @keys  释放掉的key
## @release_all  是否全部释放掉了
## @map_name  释放掉的是哪个组合键
signal released(keys, release_all, map_name)## 按键映射
var input_mapper : Dictionary = {}#==================================================
#   自定义方法
#==================================================
#(override)
func _physics_process(delta):for m in input_mapper.values():m.physics_process()##  添加 key 映射
## @key  判断的 key
## @input_maps  触发的键盘映射
## @just  仅仅在按下那一刻才检测到
## @or_input  其中的一个按下即为各个都按下
func add_mapper(key: String, input_maps: PoolStringArray, just: PoolStringArray = [],or_input: PoolStringArray = []
):input_mapper[key] = ComponseKey.new(self, key, input_maps, just, or_input)##  获取已按下的键
## @key
func get_inputed_key(key: String) -> Array:return input_mapper[key].get_inputed()##  清除按键记录
## @key
func clear(key: String):input_mapper[key].clear()##  清空所有按键记录
func clear_all():for key in input_mapper:input_mapper[key].clear()##  回调方法
##(每个组合键会在释放掉记录的按键时,调用这个方法)
## @data
func callback(data):emit_signal("released", data.released_keys, data.released_all, data.map_name)#==================================================
#   组合键
#==================================================
class ComponseKey:# 在这个时间内按下的组合键则进行释放,可自行调整修改这个时间# 不过如果值太小,会判定困难,因为用户可能两个键按键间隔没有那么快const DURATION = 0.1var _host : Nodevar _map_name : String = ""var _release_timer := Timer.new()var _delta = 1.0 / ProjectSettings.get("physics/common/physics_fps")# 仅仅在按下的时候才被检测var _just := {}# 或输入(其中一个按下了,则全部都算作按下了)var _or_input := {}# 已按下的按键var _inputted := {}# 已按下按键的数量var _inputted_count : int = 0func _init(host: Node    # 这个对象的宿主,用于添加计时器到这个节点上, map_name : String, input_maps: PoolStringArray  # 判定的按键 , just: PoolStringArray = []   # 是否只是在按下那一刻才测到, or_input: PoolStringArray = []    # 其中一个按下,即为都按下) -> void:_host = host_map_name = map_name# 添加重置计时器_release_timer.wait_time = DURATION_release_timer.one_shot = true_release_timer.autostart = falseif _release_timer.connect("timeout", self, "release") != OK:printerr(self, "连接信号时出现错误")_host.add_child(_release_timer)# 初始化数据for key in input_maps:self._inputted[key] = falsefor key in just:self._just[key] = keyfor key in or_input:self._or_input[key] = key## 检测func physics_process() -> void:for key in _inputted.keys():# 按下时捕获输入if _just.has(key):if Input.is_action_just_pressed(key):set_inputted_key(key)# 每帧都捕获输入else:if  Input.is_action_pressed(key):set_inputted_key(key)## 设置已输入的按键func set_inputted_key(key: String):if key in _or_input:for i in _or_input:if !_inputted[i]:_inputted[i] = true_inputted_count += 1else:if !_inputted[key]:_inputted[key] = true_inputted_count += 1# 开始倒计时if _release_timer.is_stopped():_release_timer.start()# 如果已按下全部按键,则进行释放elif is_all_inputted():_release_timer.stop()release()## 是否全部按下func is_all_inputted() -> bool:return _inputted_count == _inputted.size()## 释放掉所有按键记录,重置状态func release() -> void:var list = get_inputed()clear()# 回调宿主的 callback 方法_host.callback({released_keys = list, released_all = (list.size() == _inputted.size()), map_name = _map_name,})## 获取已按下的键func get_inputed() -> Array:var list := []for key in _inputted.keys():if _inputted[key]:list.push_back(key)return list## 清除内容func clear():_release_timer.stop()_inputted_count = 0# 重置按下状态for key in _inputted.keys():_inputted[key] = false

示例文件:ComponseInput.rar

运行后,按下小键盘的方向键 + 空格键,查看编辑器底部中的输出内容

【Godot】组合键的实现相关推荐

  1. react 监听组合键_投资组合中需要的5个React项目

    react 监听组合键 You've put in the work and now you have a solid understanding of the React library. 您已经完 ...

  2. THINKPAD笔记本Fn组合键介绍

    THINKPAD笔记本Fn组合键介绍 Fn键作为笔记本的组合键,和其他键组合使用时会有强大的功能,很多使用技巧都是通过Fn组合键来实现的.下边就为大家总结一下IBM ThinkPad系列笔记本Fn键的 ...

  3. windows命令大全_必收藏!电脑快捷键、组合键大全

    键盘快捷键使用大全所谓快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令,从而达到提高操作速度的目的.下面为大家介绍一些常用快捷键的使用和功能.希望这些电脑快捷键大全可以给用户带来便捷的上网体 ...

  4. js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入

    设置快捷键 这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb). hotkeys on Github hotkeys预览 __ __ __ | ...

  5. Bash基础(2) 通配符 组合键 数据重定向 管道 tee

    Bash基础(2)     通配符  组合键  数据重定向  管道  tee命令 1 文本名"通配符" *:匹配任意长度的任意字符: ?:匹配任意单个字符: []: 匹配指定范围内 ...

  6. 这是高手最常用的第一快捷组合键 - imsoft.cnblogs

    1.锁定电脑 2.要找电脑上的文件时,一般人会先找到"我的电脑",然后点击打开,而高手总是很酷的,轻轻按下键盘上的Windows键不放然后再按E键,直接打开电脑的资源管理器,而一般 ...

  7. Ctrl+Alt组合键在VMware虚拟机中如何使用

    http://kb.vmware.com/kb/1011705 现象: Ctrl+Alt+其他键的组合并不如期生效,比如Ctrl+Alt+Esc,Ctrl+Alt+F2(Linux切换终端) 分析: ...

  8. QlikView Script -组合键处理

    QlikView装载数据时,如果有两个或以上表中存在两个或以上相同的字段时就会自动产生组合键. 组合键实际上是产生了表间的多对多关系,这种关系逻辑上可能是对的.组合键会引起QlikView性能隐患,存 ...

  9. 关于PostMessage后台发送组合键

    PostMessage发送组合键,我实验过几次,都失败 比如下面这些语句发送ALT+V, 根本无法发送成功 PostMessage(hWnd,WM_SYSKEYDOWN,VK_MENU,0); Pos ...

  10. 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行

    如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行   JavaFX 的恼人之处在于很多基本的操作都要自己亲力亲为.在默认情况下,在 Tex ...

最新文章

  1. ecs和eks 比较_如何使用Kubernetes,EKS和NGINX为网站设置DNS
  2. web.py使用要点
  3. 使用AspectJ审计Spring MVC Webapp。 第2部分
  4. python单词词典_python:单词和词形词典
  5. lua OOP实现对象的链式调用
  6. JavaScript基础面试题
  7. flightgear通过UDP协议输出飞行态势数据以及利用C++接收flightgear数据
  8. STM32F207时钟系统解析
  9. 计算机考研考心理学,跨专业考研心理学研究生好考吗
  10. TCP 的拥塞控制方法 ----AIMD
  11. 【esp32】esp-ali-smartliving源码分析
  12. 医学病理图像:细胞间质与间质细胞的区别
  13. 梁漱溟:做学问的八层境界
  14. android全局检索文件,Android系统中基于FTS的全文检索器
  15. 性能测试:游戏Jank卡顿及卡顿率
  16. c语言程序设计素材,C语言设计素材.doc
  17. CCF关于举办CSP-S/J的报名通知
  18. mkdir -p的用法
  19. 基于SSM的垃圾分类管理系统
  20. 千聊资费说明和提现须知

热门文章

  1. 统计学中cv表示什么_cv是什么意思
  2. 联通猫无线灯闪 不能连接服务器,猫如何连接路由器,光猫光信号一直闪红灯
  3. 2022 最新 IntelliJ IDEA 2022 详细配置步骤演示(图文版)
  4. 魔兽争霸显示比例调整的问题
  5. 数据库防火墙应具备哪些能力
  6. 【数字IC第一步】Linux系统安装(含常用IC软件)
  7. 【新手村专属】服创比赛总结
  8. ssh-keygen 常用命令与参数
  9. Ios常用第三方动画框架(三)
  10. Linux安装R相关包出现icudt error