Cocos独立游戏开发框架中的事件管理器
引言
本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。在独立游戏开发中,事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互,实现模块之间的解耦和通信。
什么是事件管理器
游戏开发中的事件管理器是一种用于处理游戏内部模块之间通信和交互的工具或系统。它允许游戏中的不同元素、对象或系统能够相互通知和响应事件,从而实现游戏逻辑的交互和动态变化。事件管理器在游戏开发中扮演着关键的角色,有助于降低代码耦合度,提高代码的可维护性和可扩展性,同时也使得游戏的开发过程更加灵活和高效。
在游戏开发中,许多不同的对象和模块需要进行通信,例如玩家输入、游戏内部状态变化、碰撞检测等。事件管理器提供了一个中心化的机制,使得这些对象和模块能够通过发送和监听事件来进行通信,而不必直接依赖彼此的具体实现细节。这有助于减少代码之间的依赖性,使得游戏开发者可以更加专注于单个模块的设计和开发,从而提高代码的可维护性。
事件管理器通常基于观察者模式(Observer Pattern)实现。核心思想是,一个事件管理器维护了一系列观察者(监听器),当某个事件发生时,它会通知所有注册了该事件的观察者,从而触发相应的回调函数或操作。这样,游戏中的不同模块可以通过监听事件来实现通信和协作,而无需直接引用或调用彼此的方法。
例如,在一个角色扮演游戏中,玩家可能控制一个角色进行移动。当玩家按下移动键时,游戏可以使用事件管理器发送一个“移动事件”,然后角色控制模块可以监听这个事件并响应,使得角色按照玩家的输入进行移动。
事件管理器的重要性
- 模块解耦与复用: 在独立游戏开发中,游戏逻辑往往由多个模块组成,如玩家控制、敌人行为、关卡切换等。事件管理器能够使这些模块之间解耦,从而减少依赖关系,使得每个模块能够独立存在、修改和复用,提高代码的可维护性。
- 灵活的通信机制: 事件管理器为开发者提供了一种灵活的通信机制,不同模块可以通过订阅事件来监听特定类型的消息。这意味着开发者可以在游戏运行时动态添加或移除事件监听器,实现实时的交互和反馈。
- 逻辑集中管理: 游戏中的各种逻辑事件,如玩家获得道具、任务完成、游戏胜利等,都可以通过事件管理器进行集中管理。这样一来,开发者可以更清晰地掌控整个游戏的流程和状态变化。
- 快速迭代与测试: 事件管理器的使用使得开发者能够更加快速地进行迭代和测试。通过模拟不同事件的触发,开发者可以更方便地验证游戏逻辑是否正确,加快开发周期。
- 多平台适应: 在独立游戏开发中,很多游戏可能需要适配不同平台,如PC、移动设备、主机等。事件管理器可以帮助开发者在不同平台上更好地管理游戏逻辑,减少平台适配的工作量。
事件管理器的设计原则
- 发布-订阅模型: 事件管理器应该基于发布-订阅模型,其中对象可以订阅特定类型的事件,并在事件发生时接收通知。
- 事件类型: 开发者应该能够定义各种自定义的事件类型,以适应不同的游戏逻辑需求。
- 灵活性: 事件管理器应该具备灵活性,允许多个订阅者监听同一事件,以及订阅者可以选择性地取消订阅。
- 数据传递: 事件管理器应该能够传递事件相关的数据,以便订阅者可以根据事件情境进行响应。
事件管理器的实现
1.新建脚本EventMgr继承cc.EventTarget
在Cocos Creator中,cc.EventTarget 是一个用于事件处理的类。它提供了一种机制,允许您在不同的对象之间发送和接收事件,以便实现解耦和更好的交互性。因此我们只需要继承它然后封装一下就能简单实现事件管理器。

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

3.封装接口
订阅事件。

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

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

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

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

4.效果演示
测试on和once接口:

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

测试off接口:

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

测试targetOff接口:

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

总结
代码整洁之道在于解耦,事件管理器有助于各模块代码之间最大程度地解耦,提高代码的可维护性。
本文的重点内容主要有以下几点,不知道小伙伴们是否已经理解:
- 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。
- 事件管理器的介绍。
- 事件管理器的重要性。
- 事件管理器的设计原则。
- 源码通过关注“亿元程序员”发送"EventMgr"获取。
AD:笔者已经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家可以自行点击搜索体验。
感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业经验的主程。学习游戏开发不迷路。感谢您的关注,希望能给到您帮助, 也希望通过您能帮助到大家。
喜欢的可以点个赞、点个在看哦!请把文章分享给你觉得有需要的其他小伙伴。谢谢。
相关文章:
Cocos独立游戏开发框架中的事件管理器
引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。在独立游戏开发中,事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互,实现模块之间的解耦和通信…...
keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群
一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…...
网络安全(黑客)零基础自学
网络安全是什么? 网络安全,顾名思义,网络上的信息安全。 随着信息技术的飞速发展和网络边界的逐渐模糊,关键信息基础设施、重要数据和个人隐私都面临新的威胁和风险。 网络安全工程师要做的,就是保护网络上的信息安…...
如何把本地项目上传github
一、在gitHub上创建新项目 【1】点击添加()-->New repository 【2】填写新项目的配置项 Repository name:项目名称 Description :项目的描述 Choose a license:license 【3】点击确定,项目已在githu…...
跳跃游戏【贪心算法】
跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。在这里插入图片…...
vue2+element-ui 实现下拉框滚动加载
一、自定义滚动指令。 VUE.directive( el-select-loadmore: { bind(el, binding) { const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap) SELECTWRAP_DOM.addEventListener(scroll, function () { /*…...
探索AIGC人工智能(Midjourney篇)(二)
文章目录 利用Midjourney进行LOGO设计 用ChatGPT和Midjourney的AI绘画,制作儿童绘本故事 探索Midjourney换脸艺术 添加InsightFaceSwap机器人 Midjourney打造专属动漫头像 ChatGPT Midjourney画一幅水墨画 Midjourney包装设计之美 Midjourney24节气海报插画…...
01-Flask-简介及环境准备
Flask-简介及环境准备 前言简介特点Flask 与 Django 的比较环境准备 前言 本篇来介绍下Python的web框架–Flask。 简介 Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内…...
【Git游戏】远程分支
origin/<branch> 远程分支在本地以 origin/<branch>格式存在,他指向上次和远程分支通过时的记录 git checkout origin/<branch> 会出现HEAD分离的情况 与远程通讯 git fetch —— 从远端获取数据(实际上将本地仓库中的远程分支更新…...
Day07-ElementUI
Day02-ElementUI 一 菜单设计 1 静态菜单 a 在components文件夹中新建一个组件Menu.vue <template><div class="menu-wrap"><el-menuclass="el-menu-vertical-demo"background-color="#031627"text-color="#fff"ac…...
【Go 基础篇】Go语言中的defer和recover:优雅处理错误
Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面,Go语言提供了一种优雅的机制,即通过defer和recover组合来处理恐慌(panic)错误。本文将详细介绍Go语言中的defer和recover机制,探讨其工作原理…...
4.15 TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
目录 HTTP 的 Keep-Alive TCP 的 Keepalive 总结: HTTP的Keep-Alive,是应用层(用户态)实现的,称为HTTP长连接; TCP的Keepalive,是由TCP层(内核态)实现的,…...
如何在VSCode中将html文件打开到浏览器
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
2022年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:拦截导弹 某国为了防御敌国的导弹袭击, 发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷: 虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天, 雷达捕捉到敌国的…...
五公里场地训练笔记(完整版)
由于考研和口罩等原因,停跑了比较长的时间。中长距离就是这样,修为尽失,大概是要从头开始了,不过还是要乐观的面对,CHEER UP! 翻看咕咚软件,以前的PB是21:12,在2017年9月…...
【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
使用 OpenAI GPT 模型的最佳实践
推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 为了帮助用户获得最佳输出,OpenAI 提供了使用 GPT 模型的最佳实践。这来自体验,因为许多用户不断尝试使用此模型并找到了最有效的方法。 在本文中,我将总结使用 Ope…...
解除用户账户控制提醒
解决用户账户控制提醒 1. 前言2. 解决用户账户控制提醒2.1 控制面板2.2 注册表2.3 UAC服务 结束语 1. 前言 当我们使用电脑时,有时进行安装应用或者打开应用时,总会弹出一个提示框,要选择点击是否允许程序运行; 系统经常弹出用户…...
行业追踪,2023-08-23
自动复盘 2023-08-23 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
算法修炼Day60|● 84.柱状图中最大的矩形
LeetCode:84.柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣(LeetCode) 1.思路 双指针思路,以当前数组为中心,借助两个数组存放当前数柱左右两侧小于当前数柱高度的索引,进行h*w的计算。注意首尾节点的左侧索引…...
从自由建模到精确设计:CAD_Sketcher如何为Blender带来工程级草图绘制能力
从自由建模到精确设计:CAD_Sketcher如何为Blender带来工程级草图绘制能力 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾在使用Blender进行机械设计时&…...
ML:SARSA 的基本原理与实现
在强化学习中,智能体(Agent)并不是一次性从已有标签中学习答案,而是在环境(Environment)中不断尝试动作、观察结果、获得奖励,并根据经验逐步调整行为策略。在 Q 学习中,智能体可以通…...
解决ClaudeCode频繁封号与Token不足的Taotoken替代方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决ClaudeCode频繁封号与Token不足的Taotoken替代方案 对于依赖Claude Code这类编程助手工具的开发者而言,访问不稳定…...
毕业季救星:Word 2016域代码终极指南,让你的参考文献列表和文内引用完美同步
学术写作效率革命:用Word域代码构建智能参考文献系统 每到毕业季,总有一群人在深夜里对着电脑屏幕抓狂——他们的论文参考文献编号像多米诺骨牌一样,因为中间插入了一个新引用而全部错乱。手动调整几十处引用编号不仅耗时,还容易出…...
青少年情绪障碍辅导机构大筛选,教你选流程规范的靠谱机构
一、为什么要看这份榜单当孩子出现情绪障碍,如叛逆、抑郁、焦虑等问题时,家长往往会感到焦虑和无助,不知道该选择哪家辅导机构。一份客观、专业的辅导机构榜单,可以为家长提供有价值的参考,帮助他们快速了解不同机构的…...
MiGPT终极指南:如何将小爱音箱改造成AI语音助手
MiGPT终极指南:如何将小爱音箱改造成AI语音助手 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 在智能家居日益普及的今天࿰…...
LED照明技术演进中的杰文斯悖论:从节能到光污染的双刃剑效应
1. 从“省电”到“光污染”:LED照明技术的双刃剑效应作为一名在电子工程和消费电子领域摸爬滚打了十几年的从业者,我见证了一波又一波的技术浪潮。从CRT到LCD,从机械硬盘到固态硬盘,每一次技术迭代都伴随着“更高效、更节能、更便…...
XT2055 双灯显示微型线性电池充电管理芯片
■ 产品概述 XT2055 是一款完善的单节锂电池恒流/恒压线性充电管理芯片。较薄的尺寸和较小的封装使它适用于便携式产品的应用,XT2055 也适用于 USB 的供电电路。得益于内部的MOSFET 结构,在应用上不需要外部电阻和阻塞二极管。在高能量运行和外围温度较高…...
AI支付架构选型:Card Rails与Agent Rails的深度对比与实践指南
1. 项目概述:AI支付架构的十字路口最近在设计和落地几个AI驱动的支付系统时,我反复被一个核心的架构选择所困扰:是采用“Card Rails”还是“Agent Rails”?这不仅仅是技术选型,更是两种截然不同的产品哲学和风险控制思…...
3步解锁百度网盘满速下载:告别限速困扰的完整方案
3步解锁百度网盘满速下载:告别限速困扰的完整方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的非会员下载速度而烦恼吗?面对100KB/…...
