HTML5 2D平台游戏开发#8指令技
一般在动作游戏中,玩家可以通过对输入设备输入一系列的指令让角色完成某个或多个特定的动作。以格斗游戏《拳皇》为例,键入↓↘→↘↓↙← + A or C
可以触发IORI的必杀技八稚女:
通过一系列输入最终让角色完成某个动作,就是指令技。其原理是通过将玩家的键入与指令技列表中的键位进行比对,如果一致,就匹配成功。以下是JavaScript的简单实现:
class Instruct { constructor(callback) { this.instructs = {}; this.MAX_INTERVAL = 250; //超时时间 this.interval = 0; //上一次输入的时间 this.pressedKeys = []; //记录输入 this.callback = callback; window.addEventListener('keydown',this.onKeyDown.bind(this)); } //注册指令 registerinstruct(instructName,instructKeys) { if(this.instructs[instructName]) return false; this.instructs[instructName] = instructKeys; return true; } onKeyDown(e) { let now = +new Date; if(now - this.interval > this.MAX_INTERVAL) this.pressedKeys = []; this.interval = now; //记录指令 this.pressedKeys.push(e.keyCode); //检查指令 this.checkForinstruct(); } checkForinstruct() { let instructFound = ''; for(let instructName in this.instructs) { if(this.instructs.hasOwnProperty(instructName)) { //通过比对已记录的指令与设置好的指令来确认是否符合条件 if (this.pressedKeys.join(' ').indexOf(this.instructs[instructName].join(' ')) > -1) { instructFound = instructName; break; } } } if(instructFound !== '') { this.pressedKeys = []; this.callback && this.callback.call(this,instructFound); } } removeinstruct(instructName) { if(this.instructs[instructName]) { this.instructs[instructName] = undefined; return true; } return false; } }
使用方法:
var instruct = new Instruct((matching) => { console.log(matching); }); instruct.registerinstruct('demo',[83,68,83,65,74]); // ↓ → ↓ ← J
下面是一个实际操作的例子,输入S D S A J
(正转半圈、反转半圈+J)来触发:
实现了指令技以后,就能将这个方法用到游戏中,游戏使用U
键可以让角色冲刺,另外如果输入→+→
也能达到同样的效果。下图即是使用指令达到的效果:
更新日志
2017/04/09 更新角色跳跃
2017/04/21 更新角色冲刺
2017/05/01 更新角色状态机
2017/05/16 更新角色攻击动画
2017/05/22 更新角色移动攻击动画
2017/05/24 更新角色跳跃攻击动画
2017/06/04 更新地图绘制
2017/06/22 更新摄像机、长距离冲刺
2017/07/01 更新指令技