格斗类游戏键盘处理

想用COCOS做个格斗游戏,刚开始用了addListener做了基本移动和攻击,但是发现要是继续用这个就会变得好复杂,比如 ↓ ← → A 放一个技能处理起来就会很困难,又由于是新手只能到处查找关于资料,最后找到了下面的一个参考资料,不过不是很懂如何双个单元读取键盘缓冲区,就自己另辟蹊径,不过原理差不多,目前我用的方法是将指令分级(基本动作指令如前后走动一个等级,技能指令一个等级),建立两个数组(之所以采用两个数组是因为如果只使用一个数组储存指令那对于需要长按的技能指令周期太短会录制不完全,相反,周期太长会影响基本操作出现无效指令情况),分别储存短周期指令和长周期指令,指令用一个开始点是按下键盘那一瞬间(防止一个指令横跨两个周期的情况出现)的短周期不断读取键盘按下键位并存入数组,长短指令唯一区别就是清空数组周期,当然还要防止不断按下一个键的情况,如按着 ← 不放那岂不是数组全是 ← ?所以还需要中间变量判断这个键是否弹起,没弹起则不录入,这样一个周期到就将录制的键和技能池做对比就能实现指令了。

因为是刚刚才开始接触这类东西的新手,不知道这种处理有没有问题,想问下大家还有其他方案处理这种键盘事件么?

你是不是以前学嵌入式的?我没做过格斗游戏,但是我感觉你的设计思路可能有点不清晰。选好解决问题的方向可能更重要一点。我的建议:
1、这种输入控制一般是用“状态机模型”来设计的,“有限状态机”、"层次状态机"和“下推自动机”,尤其是这个“下推自动机”和“层次状态机”。
2、你所说的“缓冲”和“数组清空”,这个算是“玩家输入的记录”,其数据结构最好是“栈”或者“队列”,这个非常重要,“栈”就是“下推自动机”的实现方式。但是我说的和你想设计的不是同一个东西,设计上看,还没到用“记录玩家输入”进行思考的时候。开始的时候,不要用你说的“数组来记录操作”来思考,“记录操作”本质上把状态机模型给隐藏起来了,说明你并不知道用状态机来进行设计,“数组记录玩家操作”其实是“子状态机的实现”,这可能是你思考上的盲点。
3、实现第1点的指令输入架构模式,建议用“状态模式”和“命令模式”,让结构更清晰一点。(《游戏编程模式》这本书很有看得必要)

以上,我并没有解决你的具体细节,根据你的描述,我很难帮你解决,我认为帮你理清思路更重要。你在细节上的纠结,很大程度上是设计思路一开始没想好的原因,或者你并不知道用“状态机”这个概念来进行设计。如果是我个人设计这个,我会用状态模式把“玩家输入”更加的细分,应该会用到“层次状态机”。我看过这个文章《a-player-class-and-state-machine-in-cocos2d-x》的文章(科学上网)还有这个《如何设计(规划)一款游戏战斗系统的状态机》。

5赞

首先,感谢您的留言和建议,刚刚把自己写的机制搬运到游戏上了,发现并不理想,很多状态冲突,而且延迟是个问题,看来事情不是那么好解决。恩,正在学嵌入。百度能解决的问题一般很少问,不过CCC的资料太少了,实在找不到什么资料才来问的,看来还是有人的。关于您说的这些我还不是很懂,等我阅读完毕后还有什么不懂的再来请教您。

写了好多,然而我什么都没看懂,现在新手都这么高深吗?还是我已经老了。

对我来说无非就两三步的事,声明一个数组,保存要连招的方向键,再建个定时器,如果没有方向键按下,设定为0.5秒将这个数组清空一次,也就是连招间隔是0.5秒。

之后就是连招触发,一般格斗游戏,动作都比较多,可能A键是拳,B键是脚,不管哪个。按下A或B都应该为连招终结键,触发并检查该键上的连招。

顺序是由复杂到简单,对连招的方向键数组进行匹配检查。如果你方向键数组是添加末尾,那么检查的顺序应该为[arr.length-1]、[arr.length-2]、[arr.length-3]这样,如果是添加到开头,就简单的多了,直接[0]、[1]、[2]这么检查,最后再次将那个保存方向键的数组清空,基本就完事了。。。

2赞

谢谢,可能我新接触,没个概念,把问题复杂化了(说了些乱七八糟的东西),不过我现在大概就是你这样做的,可是现在看了LSS的关于"状态机"和"下推自动机"的文章后感觉自己又要重新写了。

你好,请问连招的问题您解决了?新人有问题想要请教一下