当前位置: 首页 > news >正文

游戏开发中的按键操作管理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 },
]

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

  GameInputMgr.getInstance().addKeyListener(this)
  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. 在ui的父类中添加监听支持
    //按键事件处理
    addKeyEventListener() {
        GameInputOperator.getInstance().on(this.getName(), this)
    }

    removeKeyEventListener() {
        GameInputOperator.getInstance().off(this.getName())
    }
    onDestroy() {
        this.removeKeyEventListener();
    }

    start() {
        this.addKeyEventListener();
    }

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

结语

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

相关文章:

  • 构建自己的无人驾驶系统
  • js中的同步任务、异步任务、宏任务、微任务
  • 给大家推荐一套 git 工作流
  • JWT解密和python反序列化之[CISCN2019 华北赛区 Day1 Web2]ikun
  • 《用Go语言自制解释器》之第3章 求值
  • C++ - 8月31日 - 约瑟夫环问题
  • C++ 模板泛型编程
  • Retrofit原理解析(二)
  • 数据结构与算法 -- 子序列问题
  • python中namedtuple函数用法详解
  • C++设计模式---模板方法模式
  • 数据结构和算法——绪论
  • 最小生成树算法的相关变形题
  • Android中常用的几种容器视图的使用
  • 随手记面试录
  • 收藏网友的 源程序下载网
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Angular Elements 及其运作原理
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • express.js的介绍及使用
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • js如何打印object对象
  • js学习笔记
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PAT A1017 优先队列
  • supervisor 永不挂掉的进程 安装以及使用
  • SwizzleMethod 黑魔法
  • win10下安装mysql5.7
  • 订阅Forge Viewer所有的事件
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信小程序开发问题汇总
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 湖北分布式智能数据采集方法有哪些?
  • #LLM入门|Prompt#3.3_存储_Memory
  • ()、[]、{}、(())、[[]]命令替换
  • (39)STM32——FLASH闪存
  • (4)logging(日志模块)
  • (4)事件处理——(7)简单事件(Simple events)
  • (js)循环条件满足时终止循环
  • (pytorch进阶之路)扩散概率模型
  • (二)c52学习之旅-简单了解单片机
  • (过滤器)Filter和(监听器)listener
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Unity3DUnity3D在android下调试
  • (转载)利用webkit抓取动态网页和链接
  • *2 echo、printf、mkdir命令的应用
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET导入Excel数据
  • .NET简谈设计模式之(单件模式)
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net中生成excel后调整宽度
  • .sh
  • @RequestBody的使用