游戏开发中的按键操作管理2
前言
上一篇文章中介绍了如何将不同平台按键的键值转换成我们自定义的键值。这篇介绍一下各个界面上如何处理这些自定义按键的操作。
按道理讲,每个界面都需要监听按键事件,然后处理自己关心的键值操作。如此一来,所有开发的同学都需要参与其中,即使界面很简单,都需要去修改代码以支持按键操作。
我这边给出的方案是使用一个管理器监听按键操作。界面打开时将自己注册到管理器中,界面关闭时从管理器中移除。然后通过配置表,设置按钮名称,按钮被点击后调用的函数和界面的名称。然后在管理器收到按键操作事件时遍历最后一次注册的组,调用设置好的函数。
具体方式如下:
- 添加配置数据和处理类。
//哪个界面,按什么键,调用什么方法。使用group来做事件的层级逻辑。
export let config: ConfigInfo[] = [
{ name: "NewTest", button: "Button1", function: "onButtonClick", keycode: "D", group: 1 },
{ name: "NewTest", button: "Button2", function: "onButtonClick2", keycode: "S", group: 1 },
{ name: "NewTest", button: "Button3", function: "onButtonClick3", keycode: "BACKSPACE", group: 1 },
{ name: "TestView", button: "Button4", function: "onButtonClick", keycode: "ENTER", group: 2 },
]
这些数据可以写到数据表中,让策划填写一部分。
2. 管理器监听按键事件
GameInputMgr.getInstance().addKeyListener(this)
- 管理器实现SingleKeyListener中的接口
isBlockInput(): boolean {
return true;
}
onKeyBoardPress(keyCode: number, data: GameInputEvent): void {
console.log("GameInputOperator onKeyBoardPress " + data.keyCode, keyCode);
}
onKeyBoardRelease(keyCode: number, data: GameInputEvent): void {
// console.log("GameInputOperator onKeyRelease:1111 " + keyCode, this.groupList.length);
if (this.groupList.length > 0) {
let observer: InputGroup = this.groupList[this.groupList.length - 1]
if (observer) {
observer.emit(keyCode, data)
}
}
console.log("GameInputOperator onKeyBoardRelease " + data.keyCode, keyCode);
}
- 在ui的父类中添加监听支持
//按键事件处理
addKeyEventListener() {
GameInputOperator.getInstance().on(this.getName(), this)
}
removeKeyEventListener() {
GameInputOperator.getInstance().off(this.getName())
}
onDestroy() {
this.removeKeyEventListener();
}
start() {
this.addKeyEventListener();
}
如此一来,当管理器接受到按键事件时,自然会根据配置数据,找到当前存在的界面,并根据按键的键值找到需要被调用的函数。
结语
对于按键操作的处理就介绍这些了。源码地址。欢迎关注《微笑游戏》公众号,了解更多游戏开发相关的内容。