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

news2024/11/16 9:32:10

引言

本系列是《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.coloradmin.cn/o/933962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BDCC - 闲聊数据仓库的架构

文章目录 典型数据仓库架构图数据仓库ETL vs ELTETLELT区别联系 数据仓库分层(1)数据仓库ODS层(2)数据仓库CDM层DWD数据明细层DWS数据汇总层 (3)数据仓库ADS层 典型数据仓库架构图 按自下而上的顺序&#x…

Linux系统---信号

文章目录 信号是什么信号的产生信号的系统调用接口软件条件产生信号硬件异常产生信号阻塞信号信号处理 一、信号是什么 1.生活中的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时, 你该怎么…

基于Java+SpringBoot+Vue前后端分离景区民宿预约系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Python3 元组

Python3 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号 ( ),列表使用方括号 [ ]。 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。 实例(Python 3.0) >>> tup1 (Go…

slice(切片)

在Python中,切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。 切片的基本语法为: object…

NPM 管理组织包

目录 1、关于组织范围和包 1.1 管理无作用域的包 2、使用组织设置配置npm客户端 2.1 配置您的npm客户端以使用您组织的范围 为所有新包设置组织范围 为单个包设置组织范围 2.2 将默认包可见性更改为public 将单个包的包可见性设置为public 将所有包的包可见性设置为pu…

字节一面:闭包是什么?闭包的用途是什么?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,因为在前端开发的日常开发中我们经常会用到闭包,我们会借助闭包来封装一些工具函数,所以更深的了解闭包是很有必要的,博主在这给大家细细…

C#,《小白学程序》第三课:类、类数组与排序

1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /// 学号 /// </summary> public int Id; /// <summary> /// 姓名 /// </summary> public string Nam…

MongoDB 双机热备那篇文章是 “毒”

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 liuaustin3 &#xff08;…

Web服务器基础 http协议

文章目录 1.Web基础1.1MIME1.2 URI 和 URL1.2.1定义1.2.2两者的区别 2.静态资源和动态资源2.1 静态资源2.2 动态资源 3.HTTP协议3.1HTTP协议简介3.2HTTP协议的版本及区别3.2.1http协议版本3.2.2http1.0和1.1的区别 3.3HTTP请求报文3.4HTTP请求访问的过程1、建立连接&#xff1a…

word 调整列表缩进

word 调整列表缩进的一种方法&#xff0c;在试了其他方法无效后&#xff0c;按下图所示顺序处理&#xff0c;编号和文字之间的空白就没那么大了。 即右键word上方样式->点击修改格式->定义新编号格式->字体->取消勾选 “……对齐到网格”->确定

微服务框架 go-zero logx 日志组件剖析

addTenant api 和 rpc 的实现 上一篇我们说到咱们还剩下 addTenant 功能还未实现&#xff0c;不知道有没有兄弟感兴趣去实验一波的&#xff0c;本篇文章进行简要补充 根据上一篇文章分析&#xff0c;其实我们只需要执行如下几步即可&#xff1a; 编写 tenant.api&#xff0c…

Vue3.0极速入门 - 登录demo

Talk is cheap, Show the code 在完成npm和vue的环境安装&#xff0c;并了解了基本的目录和文件结构以后&#xff0c;直接写一个带登录和首页的demo做示例&#xff0c;快速了解一个vue工程的创建和基本的页面跳转 第一步创建工程 1、选择手动模式创建工程 npm create app-…

工地扬尘自动监测识别算法

工地扬尘自动监测识别系统通过yolov7python网络模型深度学习算法模型&#xff0c;扬尘自动监测识别算法能够全天候、全方位地观测扬尘情况。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和通道乘数。然后&#xff0c;每个…

prometheus + grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

SQL语法与DDL语句的使用

文章目录 前言一、SQL通用语法二、DDL语句1、DDL功能介绍2、DDL语句对数据库操作&#xff08;1&#xff09;查询所有数据库&#xff08;2&#xff09;查询当前数据库&#xff08;3&#xff09;创建数据库&#xff08;4&#xff09;删除数据库&#xff08;5&#xff09;切换数据…

【Linux-Day8- 进程替换和信号】

进程替换和信号 问题引入 我们发现 终端输入的任意命令的父进程都是bash,这是因为Linux系统是用fork()复制出子进程&#xff0c;然后在子进程中调用替换函数进行进程替换&#xff0c;实现相关命令。 &#xff08;1&#xff09; exec 系列替换过程&#xff1a;pcb 使用以前的只…

开源项目的资金来源:捐赠、赞助与商业模式

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

C语言(第三十一天)

6. 调试举例1 求1!2!3!4!...10!的和&#xff0c;请看下面的代码&#xff1a; #include <stdio.h> //写一个代码求n的阶乘 int main() {int n 0;scanf("%d", &n);int i 1;int ret 1;for(i1; i<n; i){ret * i;}printf("%d\n", ret);return …

delphi7创建DLL步骤方法

delphi7创建DLL步骤方法1.打开delphi7,点击File/New/Other...,如下图&#xff1a; 2.选择New/DLL Wizard,如下图&#xff1a; 3.起一个项目名称&#xff0c;然后点击File/SaveAll,这里以TestDll为例&#xff0c;如下图&#xff1a; 4.新建一个单元文件File/New/Unit,保存…