• 游戏开发中的按键操作管理2


    前言

    上一篇文章中介绍了如何将不同平台按键的键值转换成我们自定义的键值。这篇介绍一下各个界面上如何处理这些自定义按键的操作。

    按道理讲,每个界面都需要监听按键事件,然后处理自己关心的键值操作。如此一来,所有开发的同学都需要参与其中,即使界面很简单,都需要去修改代码以支持按键操作。

    我这边给出的方案是使用一个管理器监听按键操作。界面打开时将自己注册到管理器中,界面关闭时从管理器中移除。然后通过配置表,设置按钮名称,按钮被点击后调用的函数和界面的名称。然后在管理器收到按键操作事件时遍历最后一次注册的组,调用设置好的函数。

    具体方式如下:

    1. 添加配置数据和处理类。
    //哪个界面,按什么键,调用什么方法。使用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 },
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这些数据可以写到数据表中,让策划填写一部分。
    2. 管理器监听按键事件

      GameInputMgr.getInstance().addKeyListener(this)
    
    • 1
    1. 管理器实现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);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. 在ui的父类中添加监听支持
        //按键事件处理
        addKeyEventListener() {
            GameInputOperator.getInstance().on(this.getName(), this)
        }
    
        removeKeyEventListener() {
            GameInputOperator.getInstance().off(this.getName())
        }
        onDestroy() {
            this.removeKeyEventListener();
        }
    
        start() {
            this.addKeyEventListener();
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    如此一来,当管理器接受到按键事件时,自然会根据配置数据,找到当前存在的界面,并根据按键的键值找到需要被调用的函数。

    结语

    对于按键操作的处理就介绍这些了。源码地址。欢迎关注《微笑游戏》公众号,了解更多游戏开发相关的内容。

  • 相关阅读:
    程序员如何利用周末提高自己?
    C# Onnx LSTR 基于Transformer的端到端实时车道线检测
    vue重修004【下部】
    【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
    做项目必读的vue3基础知识
    Scrum 四个会议的正确召开方式
    SAP 电商云 Spartacus UI UrlMatcherService 的用法介绍
    工作任务管理平台作品集源文件 figma格式UX/UI设计师作品集
    ADC驱动怎么应用以及中断顶半部和底半部
    【深度学习的未来:探索无监督学习的潜力】
  • 原文地址:https://blog.csdn.net/cgw0827/article/details/126583127