键盘控制物体移动模型,是一套基于jQuery库的,利用在JavaScript游戏中的,键盘控制物体移动的解决方案。在网上流传的形形色色的移动模型中,只有一种方案,可以最高效的处理JavaScript FPS游戏的按键模型。
点击这里查看演示模型,
点击这里下载模型演示源文件。
在介绍这套方案之前,先阐述一下网传的部分低效的解决方案。如果使用了这些方案,会使屏幕在显示的时候,光标一直呈“漏斗”状态,CPU消耗严重。
FPS(Frame Per Second)游戏,是指在1秒内频繁刷新屏幕,以更新状态的游戏。部分刚刚接触游戏开发的朋友,出于简单的目的,每制作一个物体移动的动画,便启动一个计时器。最终导致了计时器的嵌套与计时器的难于管理,甚至造成了浏览器内存泄漏。而解决这类问题唯一高效的方案,则是开启一个每1毫秒刷新一次的计时器,在其中写业务逻辑。
有的朋友在处理监听键盘按键时,亦是出于方便,直接在keydown中写业务逻辑。由此造成了物体控制不流畅,按键不灵活等问题。当一个键按下时,会产生一个键盘缓冲,然后是一连串的按键响应。这时如果增加业务处理,势必造成内存的开销越来越大,甚至卡屏。解决此类问题唯一高效的办法,就是在keydown中,只记录按键的状态:按下、提起。
关于keydown事件,不同的浏览器在细节上解决的不同。在IE中,连续的按下两个按键,事件模型会将这两个键全部捕获,而在FF中,如果按键速度太快,就只能捕获到第一个按键。这种差异并非是通过编程就可以解决的。
对于某些需要使用组合按键的游戏,应使用数组来记录各个按键的状态。对于某些需要射击的游戏,还应控制发炮的间隔,以使画面更流畅。考虑到这些问题,我们构建了Input基本按键类。
在业务程序中,可以通过注册key,来完成按键动作响应。但是物体模型的按键,又分为两类:互斥按键(一次只能控制一个方向)、聚合按键(可用两个按键表示一个方向,如:上、右表示右上方)。为了解决这个需求,我们提供了Move类注册按键,使用了两个装饰者SingleDirectionMove、MultipleDirectionMove来分别处理两种按键需求。
提一下模型的bug:因为keydown与keyup必须成对出现,当窗口突然失去焦点时,会导致按键得不到释放,必须再次按下后才可恢复。这个问题很多模拟器也存在,有一些变通的办法,可以部分解决此类问题,但换来的是性能和功能的损失,所以在本模型中,未予处理此问题。