Cocos独立游戏开发框架中的事件管理器

news/2024/5/18 13:08:13 标签: 个人开发, 游戏程序, 游戏, 观察者模式

引言

本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。在独立游戏开发中,事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互,实现模块之间的解耦和通信。

什么是事件管理器

游戏开发中的事件管理器是一种用于处理游戏内部模块之间通信和交互的工具或系统。它允许游戏中的不同元素、对象或系统能够相互通知和响应事件,从而实现游戏逻辑的交互和动态变化。事件管理器在游戏开发中扮演着关键的角色,有助于降低代码耦合度,提高代码的可维护性和可扩展性,同时也使得游戏的开发过程更加灵活和高效。

游戏开发中,许多不同的对象和模块需要进行通信,例如玩家输入、游戏内部状态变化、碰撞检测等。事件管理器提供了一个中心化的机制,使得这些对象和模块能够通过发送和监听事件来进行通信,而不必直接依赖彼此的具体实现细节。这有助于减少代码之间的依赖性,使得游戏开发者可以更加专注于单个模块的设计和开发,从而提高代码的可维护性。

事件管理器通常基于观察者模式(Observer Pattern)实现。核心思想是,一个事件管理器维护了一系列观察者(监听器),当某个事件发生时,它会通知所有注册了该事件的观察者,从而触发相应的回调函数或操作。这样,游戏中的不同模块可以通过监听事件来实现通信和协作,而无需直接引用或调用彼此的方法。

例如,在一个角色扮演游戏中,玩家可能控制一个角色进行移动。当玩家按下移动键时,游戏可以使用事件管理器发送一个“移动事件”,然后角色控制模块可以监听这个事件并响应,使得角色按照玩家的输入进行移动。

事件管理器的重要性

  1. 模块解耦与复用: 在独立游戏开发中,游戏逻辑往往由多个模块组成,如玩家控制、敌人行为、关卡切换等。事件管理器能够使这些模块之间解耦,从而减少依赖关系,使得每个模块能够独立存在、修改和复用,提高代码的可维护性。
  2. 灵活的通信机制: 事件管理器为开发者提供了一种灵活的通信机制,不同模块可以通过订阅事件来监听特定类型的消息。这意味着开发者可以在游戏运行时动态添加或移除事件监听器,实现实时的交互和反馈。
  3. 逻辑集中管理: 游戏中的各种逻辑事件,如玩家获得道具、任务完成、游戏胜利等,都可以通过事件管理器进行集中管理。这样一来,开发者可以更清晰地掌控整个游戏的流程和状态变化。
  4. 快速迭代与测试: 事件管理器的使用使得开发者能够更加快速地进行迭代和测试。通过模拟不同事件的触发,开发者可以更方便地验证游戏逻辑是否正确,加快开发周期。
  5. 多平台适应: 在独立游戏开发中,很多游戏可能需要适配不同平台,如PC、移动设备、主机等。事件管理器可以帮助开发者在不同平台上更好地管理游戏逻辑,减少平台适配的工作量。

事件管理器的设计原则

  1. 发布-订阅模型: 事件管理器应该基于发布-订阅模型,其中对象可以订阅特定类型的事件,并在事件发生时接收通知。
  2. 事件类型: 开发者应该能够定义各种自定义的事件类型,以适应不同的游戏逻辑需求。
  3. 灵活性: 事件管理器应该具备灵活性,允许多个订阅者监听同一事件,以及订阅者可以选择性地取消订阅。
  4. 数据传递: 事件管理器应该能够传递事件相关的数据,以便订阅者可以根据事件情境进行响应。

事件管理器的实现

1.新建脚本EventMgr继承cc.EventTarget

在Cocos Creator中,cc.EventTarget 是一个用于事件处理的类。它提供了一种机制,允许您在不同的对象之间发送和接收事件,以便实现解耦和更好的交互性。因此我们只需要继承它然后封装一下就能简单实现事件管理器。

2.创建事件管理器单例

因为事件管理器关键的内容引擎已经帮我们实现了,那么我们只需要简单地继承一下,然后以单例的形式,使得更方便地调用。

3.封装接口

订阅事件。

订阅事件(仅订阅1次),通过该接口订阅的事件,在接收一次之后自动取消订阅。

删除订阅,通过该接口可以删除任意一个已订阅的事件。

删除目标的所有订阅。通过该接口可以删除目标所有已订阅的事件。

派发事件。所有订阅了指定事件的目标将会接收到事件,并可以作出响应。

4.效果演示

测试on和once接口:

测试通过,once接口在第一次接收到事件后消失,不会接收到第二次事件:

测试off接口:

测试通过,取消订阅之后不会再接收到该事件:

测试targetOff接口:

测试通过,取消目标订阅的所有事件后不会再收到事件:

总结

代码整洁之道在于解耦,事件管理器有助于各模块代码之间最大程度地解耦,提高代码的可维护性。

本文的重点内容主要有以下几点,不知道小伙伴们是否已经理解:

  • 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。
  • 事件管理器的介绍。
  • 事件管理器的重要性。
  • 事件管理器的设计原则。
  • 源码通过关注“亿元程序员”发送"EventMgr"获取。

AD:笔者已经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家可以自行点击搜索体验。

感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业经验的主程。学习游戏开发不迷路。感谢您的关注,希望能给到您帮助, 也希望通过您能帮助到大家。

喜欢的可以点个、点个在看哦!请把文章分享给你觉得有需要的其他小伙伴。谢谢。


http://www.niftyadmin.cn/n/4973241.html

相关文章

React Navigation 使用导航

在 Web 浏览器中,您可以使用锚标记链接到不同的页面。当用户单击链接时,URL 会被推送到浏览器历史记录堆栈中。当用户按下后退按钮时,浏览器会从历史堆栈顶部弹出该项目,因此活动页面现在是以前访问过的页面。React Native 不像 W…

python基础教程:re模块用法详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、正则表达式的特殊字符介绍 正则表达式 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ 素材、视频教程、完整代码、插件安装教程我都准备好了&a…

Linux学习笔记-Ubuntu系统下配置ssh免密访问

Ubuntu系统下配置ssh免密访问 一、基本信息二、ssh安装2.1 查看是否已经安装ssh2.2 安装ssh2.3 查看ssh安装状态 三、启动、停止,及开机自启动3.1 启动ssh3.2 关闭ssh3.3 使用systemctl设置ssh服务自启动3.4 使用systemctl关闭ssh开机启动 四、配置通过密钥进行免密…

如何在VSCode中将html文件打开到浏览器

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5…

ELK高级搜索(二)

文章目录 7&#xff0e;Java api 文档管理7.1 es技术特点7.2 获取数据7.3 文档查询7.4 文档新增7.5 文档修改7.6 文档删除7.7 文档bulk 8&#xff0e;图解es内部机制8.1 es分布式基础8.2 分片shard、副本replica8.3 单node环境创建index8.4 多node环境replica shard8.5 横向扩容…

一文了解SpringBoot中的Aop

目录 1.什么是Aop 2.相关概念 3.相关注解 4.为什么要用Aop 5.Aop使用案例 1.什么是Aop AOP&#xff1a;Aspect Oriented Programming&#xff0c;面向切面&#xff0c;是Spring三大思想之一&#xff0c;另外两个是 IOC-控制反转 DI-依赖注入 (Autowired、Qualifier、Re…

<C++> STL_vector

1.vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的…