游戏框架概述

最下面一行所有的脚本都继承于 ComponentBase 类(便于监听消息),而 ComponentBase 类 继承于 cc.component。

第二层 UI等单例 继承于 Manager 管理类,而第三层的 消息中心 继承于 MessageCenter 类

每一次传递消息 我们也需要给 消息 定义一个类 Message

具体实现例子

首先创建四个上述类

Message 类

Message 类 用于传递消息,但是我们怎么知道它这个消息要给谁呢

Message 类 里必须包含的内容:

1. 先确定我要找哪个大类(ui/npc/enemy)

2.我要找大类里面的哪个小类(也就是哪个脚本,比如铁匠、防具)

3.我要传递的内容是什么

确定好了 Message 类里面要包含什么内容,我们开始写脚本:

因为是传递消息用的类所以不需要继承于任何东西,他只是一个 Message 类。

我们把大类定义为Type,用数字来代表每个类。

Command为小类,也就是每个小脚本。

Content 为传递的内容消息,因为传递的消息可能什么类型都有,所以是any。

再设置一个构造方法,把三个参数传递进来,这个类就基本完成了。

因为如果直接用数字代替的话,我们很容易搞混我们用的是哪个大类或者哪个小类

于是我们可以定义另一个类 MessageType ,用于对应相应的数字。这样以后我们要是需要用到里面的类,我们可以很清晰准确的用上,比如要用 UI大类 的时候,我们只需要写:

就可以直接找到他,也便于后面阅读调试等。看起来很清晰,但实际上他还是个数字。

ComponentBase 类

ComponentBase 类 用于管理每个小类,也就是每个脚本。

在里面设置一个方法 ReceiveMessage 用于接收消息message,message的类型是Message类。

这样子ComponentBase 类 的子类 都能拥有接收消息的功能。

ManagerBase 类

ManagerBase 类 用于管理每个大类。

他要继承于 ComponentBase 类 ,因为它本身也要接收消息的。

定义 被管理的消息接收者数组(里面是各个小类,也就是脚本), 命名为 ReceiveList 类型为 ComponentBase[ ] (因为这些脚本其实都是继承于 ComponentBase类的),初始化为空。

定义 当前接收的具体消息类型,也就是说当前我接收到的是哪个大类。

messageType 类型为 number,先默认为空。

这时,我们需要设置当前管理类接收的消息类型,让它尽早初始化完成,于是写在 onLoad()  里面会比 start() 更好,让他提前预加载好。

在下面写个方法 SetMessageType() 返回当前管理类的消息类型,具体怎么操作呢?

比如我们在 敌人管理类 就要设置这个方法 让他返回对应的消息类型:

把小类加进数组里,我们称之为 注册消息监听。

也就是设置一个方法 RegisterReceiver(),传进来一个个小类,让它加进数组里面。

就比如 UI大类 里面有四个小类,那么它会调用四次这个方法,其他同理。

接下来,我们知道这个管理者的类也具备接收功能,那么我们也设置一个方法:

这个方法要先继承父类的方法,如上代码。

我们接收消息的话一定要接收对应的消息,比方说 消息要是 UI类型的,那么要是到了 NPC那里 ,那么 NPC 是不管这个消息的,只有类型一样才可以接收。

那么我们就需要在这里面判断一下类型:

如果不是对应的类型,则return返回。

如果是的话,那么向下分发消息(把接收到的消息派发给每一个子类,由子类自己判断是否是对应的消息,不是的话就不管该消息),遍历数组里面所有的小类。每一个小类我们都让他调用接收消息的方法(也就是上面第37行代码)。

MessageCenter 类

消息中心是单独的一个类,不需要继承组件。

因为消息中心是要管理所有的管理类的,所以我们要在管理类(ManagerBase)那边再做一件事:

就是我们每次实例化的时候,也就是管理类(ManagerBase)创建的时候会调用 onLoad()方法,那我们要把他自己加进消息中心列表里,这样我们每次写一个管理类的子类都会 被加进 消息中心的管理列表 里,只要你是继承于 管理类(ManagerBase)的,那么你就会自动被消息中心管理

实操:

设置一个 空节点 命名为 UIManager,在它里面再添加一个空节点命名为 HP 血量,在HP 里面添加两个文字节点,如图所示。

另外添加一个玩家节点。

接下来我们通过消息的方式使得,当我们点击一次玩家,玩家的血量就减少10.

写一个 玩家脚本PlayerControl 挂载在玩家节点身上:

写一个 脚本UIManager 挂载在 空节点UIManage 上:

我们先把他写成一个单例:

这样外界调用他的时候,直接写 UIManager.Instance 就直接调用他了。

最终该脚本的代码是这样的:

最后写一个 血量控制脚本HPControl  挂载在 HP节点 上面:

其中,第21行代码我们接收到的消息是 Message类型,用<>强转为number类型。

这样就实现了!

(b站飞羽老师视频总结~)

cocos creator 游戏框架相关推荐

  1. Cocos Creator游戏开发教程 学习笔记

    学完提问几个问题吧: position的锚点位置数值原点在哪里? 因为position是相对坐标,所以原点是父节点的锚点 .所以Canvas下面的直属节点原点就是世界坐标系的原点Canvas的锚点. ...

  2. 【Cocos Creator游戏开发教程】仿微信趣味画赛车小游戏(三)代码实现

    [Cocos Creator游戏开发教程]仿微信趣味画赛车小游戏(一)前言,界面UI [Cocos Creator游戏开发教程]仿微信趣味画赛车小游戏(二)物理刚体关节 项目地址已放到 github ...

  3. 一些cocos creator 游戏源码收集整理

    一些cocos creator 游戏源码收集整理 <仙剑奇侠传2>cocoscreator 2.1.4完美运行,童年经典回忆 精品源码<欢乐水杯(Happy Glass)>co ...

  4. 【Cocos Creator游戏开发教程】仿微信趣味画赛车小游戏(一)前言,界面UI

    前言 这个是我去年3月份在简书上发布的,不玩简书了,就迁到CSDN吧-- 最近遇到一款游戏,感觉玩起来还行,于是顺带就用来熟悉一下Cocos Creator(太久没用). 项目地址已放到 github ...

  5. 【Cocos Creator游戏开发教程】仿微信趣味画赛车小游戏(二)物理刚体关节

    [Cocos Creator游戏开发教程]仿微信趣味画赛车小游戏(一)前言,界面UI 项目地址已放到 github 上,需要的小伙伴可自行下载. 这节我们讲一下车子的物理刚体关节. 我在项目中添加了一 ...

  6. Cocos Creator 游戏开发常见问题(第一期)

    Cocos Creator 游戏开发常见问题(001) 1.creator 电脑双屏问题能不能修一下 2.Label 下一帧才刷新大小 怎么办 3.CocosCreator调试预览的时候,如何设置不显 ...

  7. 《Cocos Creator游戏实战》棋类游戏中的棋子摆放逻辑

    棋类游戏中的棋子摆放逻辑 创建节点 代码编写 其实要点就一句话:我们看到的不应是棋盘,而是坐标. 现在通过下面的五子棋(或围棋)实例来看下如何理解这句话. 运行效果如下: Cocos Creator版 ...

  8. 【Cocos Creator 游戏开发】开发日志-前言

    启 断断续续三四年,每年也只看一点点Cocos Creator的知识点.正好最近想用其他的东西填满自己的思绪,就开始深入研究基于Cocos Creator的游戏开发吧. 念 个人对3D游戏开发不太熟悉 ...

  9. 《Cocos Creator游戏实战》游戏转场时如何保留节点信息

    游戏转场时如何保留节点信息 使用常驻节点 使用全局变量 使用本地存储 引擎同时只会运行一个场景,当切换场景时,默认会将场景内所有节点和其他实例销毁(本句来自Cocos Creator文档). 在这一节 ...

  10. Cocos Creator游戏引擎可以支持鼠标吗_Cocos Creator入门实战:桌球小游戏

    本文作者:BigBear 多年游戏行业研发经验 精通Unreal.CocosCreator游戏引擎 参与过多款手游.端游项目的研发 Cocos Creator入门实战:桌球小游戏 本篇主要是希望能够通 ...

最新文章

  1. 开源分布式数据库中间件
  2. Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序
  3. jquery插件封装指南
  4. ios ipad适配_安卓和iOS的APP在开发时有哪些区别?
  5. livechart 只显示 y 值_输电铁塔各种截面的回转半径i值特点及其计算
  6. java rgb565转rgb888_RGB565 与 RGB888的相互转换 | 学步园
  7. 关于Android的ImageView置顶
  8. Linux netfilter hook源码分析(基于内核代码版本4.18.0-80)
  9. 用户活跃、留存、流失,终于讲清楚了!
  10. Your brain expands and shrinks over time — these charts show how
  11. ubuntu20.04.4虚拟机 ping不通百度问题解决
  12. 基于OpenCV实现二维码发现与定位
  13. 【Python项目】你们还在冲会员看电影电视剧嘛?Python带你免费看电影电视剧资源 | 附源码
  14. electron 主进程与渲染进程通讯
  15. 收藏!2022年开发运维必备的10款顶级工具
  16. java 姓名_Java生成随机姓名、性别和年龄的实现示例
  17. is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used......
  18. 【墨者学院】身份认证失效漏洞实战
  19. 在微型计算机读写速度最快,只比U盘大一点 速度却要快不少!新款影驰移动SSD实战体验...
  20. 从PayPal提现到香港招行一卡通港币,再兑换为内地招行一卡通人民币

热门文章

  1. 永中集成Office与上访科技部有感
  2. sqlserver查询语句实例
  3. CI框架精简版教程 最快上手
  4. php自动生成网站地图
  5. sql注入语句示例大全_通过示例了解SQL EXCEPT语句
  6. matlab编程dea模型,DEA的Matlab程序(数据包络分析)(最新整理)
  7. wifi分析仪怎么看哪个信道好_wifi魔盒测试的信道怎么看
  8. Peephole LSTM、GRU 实战
  9. 用matplotlib画sigmoid函数
  10. JAVA UrlRewrite 使用教程与注意点,JAVA 实现伪静态,URLRewrite实现url地址伪静态化,springboot中url地址重写(urlwrite),jeesite4伪静态