说起做FLASH游戏那么就不得不说说FLASH的键盘侦听或者说键盘控制方面的东西。控制系统的灵敏与否直接影响到游戏的手感,格斗游戏和动作游戏尤其如此。
大概今年1月离开WOW后实在比较空于是用FLASH编写了一个格斗游戏的引擎。虽然最终没有全部完工,但是积累了不少经验,也发现AS2的很多不足。其中键盘控制上获得了不少经验也是这个引擎完成度最高的部分。
如今在学习FLASH CS3和FLEX的同时打算用AS3来重新完成这个格斗梦。
在FLASH8时代,由于FLASH PLAYER8的键盘侦听有重大BUG无法正确侦听KEYUP事件,所以在PLAYER 9出来之前几乎所有制作格斗游戏的都使用PLAYER 7来制作。但是7也有问题,那就是键盘假死。实际例子就是在你按下一个键不放然后再去同时按下其他几个按键后再放开会发现第1个按下的按键的持续KEYDOWN事件被打断了。解决的方法就是用一个setInterval来时刻检测按键历史,如果发现按键停止则去检测是否所有按键都UP过。如果有按键没松开的话就代替KEYDOWN的侦听器触发事件。于是乎几乎完美的按键侦听和指令检测就这么诞生了。
如今AS3和PLAYER9的出现,10倍于原来的运算速度,更多的类包更多功能和信息让制作一款精良的个格斗游戏成为可能。开始动手当然是按键侦听和搓招系统首当其冲。由于半年多来自己AS水平有所提高,在系统要求上更比原来苛刻复杂。在原来正确侦听的基础上还要正确判断“轻击”“多段蓄力”“双击”“三击”等功能。原本做的非常顺利几乎2天就把系统搞定,但是偏偏在后来加入的“三击”事件上卡住了。经过1天时间的推敲终于可以基本检测出所有状态。但是~在其中发现了更多的问题,比如在按下一个按键不放时,按下的瞬间会触发一次KEYDOWN事件,然后在200毫秒左右后触发第2次DOWN事件,随后就会以10毫秒左右的频率连续触发DOWN事件。也就是说在按下的瞬间开始的3次DOWN事件中时间的间隔是有一个停顿的,而正是这个停顿会影响到“双击后不放”和“三击后不放”的正确判断。加入放宽了时间间隔则另外一个新问题就暴露出来了。那就是,在持续按住一个键的情况下那个以10毫秒频率连续触发的DOWN事件。加入在按住的情况下“半松”这个键则会停止触发DOWN事件,但是不触发UP事件,那么当我们按键的时候难免会出现按的比较快出现似松非松的情况,而如果前面没有放宽时间间隔判断的话这个时候由于没有连续触发DOWN事件程序会立刻判断是断开的指令,反之则无法灵敏的判断这个微弱的伪UP事件。
下图是测试出停顿的数据:

这次做这个侦听系统,发现了这2个比较麻烦的问题,给程序增加了大量额外的检测语句真是伤透了脑筋。一个大停顿和一个伪UP.... 希望键盘假死别再给我找麻烦了....