RpgMakerMV源码解析(1)-输入管理

输入管理

在几乎所有的游戏框架中都有输入管理器的存在,作用就是将系统底层的按键事件收集起来,然后对外提供一个简单的按键状态访问。
我们接下来就看看在rpgmakerMV中的输入管理实现。
rpgmakerMV可以获取键盘输入,手柄输入,以及触屏输入,分别实现在两个类Input,touchInput里,两者大同小异,我们这里主要看一看Input的实现,只要理解了基本概念,分析touchInput也是很简单的事情。
我们之前说了,输入管理器首先要从一个底层的数据源收集按键状态,在MV中这个数据源是浏览器,当然浏览器最后还是会调用到操作系统的API。
这里写图片描述
这里写图片描述
可以看到,在初始化中就对浏览器的键盘事件添加了监听。


我们看看事件处理
这里写图片描述
具体的状态设置是在最后一句。
有人可能疑惑这种状态收集的作用是什么,主要原因就是底层的事件是瞬时且不稳定的,而状态是持续的,如果你直接根据浏览器的按键事件来进行输入处理,对一个游戏来说是不合适的,比如我们可能需要按下右键持续向右移动,但是因为浏览器的按键事件触发频率并不是固定的,实际上会出现移动时快时慢的现象,但是我们这边将状态存储起来,就可以避免这种情况。


rmmv这里状态设计的比较简单,只有弹起和按下状态,分别在onKeyDown和onKeyUp里面设置,我们之后会单独写一篇输入管理谈一下如何为游戏框架设计一个强大的输入管理器。


按键映射,按键映射是输入管理一个常见的功能,提供按键名到实际keyCode的映射,这样我们可以为某个按键取一个别名,在检测的时候只要检测该别名就可以,代码看上去可读性更高,还可以把多个按键映射到一个别名上。
比如 if(Input.isKeyDown(“shoot”)){//do sth}

这里写图片描述
映射的实际逻辑如下,就是一个很简单的查表的过程。
这里写图片描述


作为一个输入管理器最重要的功能就是查询按键状态
rmmv提供的查询也比较简单
Input.isPressed 是否处在按下状态
Input.isTriggered 是否刚刚按下
Input.isRepeated 是否重复按下
Input.isLongPressed 是否长按


不过rmmv作为一个rpg游戏专用型的框架,输入管理也比通用的输入管理器更进了一层,他在update中直接将按键映射到移动方向
这里写图片描述


可以从我的github仓库获取我做的详细中文注释版的rpgmakermv源码进行学习,目前还在更新中
https://github.com/luckyCatMiao/rpgmakermv-library-ChineseAnnotations