cocos creator主程入门教程(七)—— MVC架构_cocos creator mvc框架-程序员宅基地

技术标签: cocoscreator  

这一篇将介绍在游戏客户端常用的架构MVC架构。一个游戏的MVC如下划分:

M:1)单例全局的数据中心World,所有游戏模块的数据在World中有入口,2)各个模块自己的数据结构。

V:1)通过creator预制体制作的UI界面、场景,2)各个界面显示逻辑的ViewCtrl

C:1)全局的MainCtrl,2)各个模块的业务逻辑类ModuleCtrl

 

先介绍M部分。由于一个模块的数据,在其他模块也有访问的需求,例如好友模块,在聊天的时候也需要访问,在排行榜里需要访问。数据应该有一个单例全局的数据中心类World,所有游戏模块的数据类在World中有入口。这些数据可以在玩家登录后从服务器获取并设置。

export class World {
    private static instance: World = null;
 
    private _test: TestData = null;
 
    /**
     * 单例模式
     */
    private constructor() {
 
    }
 
    /**
     * 获取实例
     */
    public static get inst(): World {
        if (!World.instance) {
            World.instance = new World();
        }
 
        return World.instance;
    }
 
    // FOR TEST
    public set test(val: TestData) {
        this._test = val;
    }
 
    public get test(): TestData {
        return this._test;
    }
}

这样模块间可以独立设计自己的数据结构,通过发送消息请求对应模块的ModuleCtrl更改,通过World读取。

export class TestData {
    private _text: string = null;
 
    public constructor() {
 
    }
 
    public set text(val: string) {
        this._text = val;
    }
 
    public get text(): string {
        return this._text;
    }
}

上一章介绍过消息分发。数据的更新时可以派发消息,界面可以监听消息做刷新。

 

下面介绍界面和脚本代码的关联。前面篇章中介绍过,cocos creator是基于组件模式。我将每个ui界面都做成一个预制体,每个预制体都可以添加一个脚本组件,用于控制这个界面的显示逻辑。

在弹窗管理里提到我设计了一个继承cc.Component的类叫ViewCtrl,所有界面的显示逻辑类都继承ViewCtrl,并添加到对应的界面预制体。前面提到数据更新时会派发消息,ViewCtrl监听数据更新消息,刷新关联的界面。

const {ccclass, property} = cc._decorator;
 
@ccclass
export default class TestViewCtrl extends ViewCtrl {
}

ViewCtrl只处理界面的显示逻辑,不处理数据业务逻辑,模块的数据业务逻辑由该模块的ModuleCtrl处理。ViewCtrl响应用户操作,派发消息,ModuleCtrl监听消息处理。大部分模块的ModuleCtrl主要做网络通信,和对本模块缓存数据的修改。

export class TestCtrl {
 
    public constructor() {
 
    }
 
    public init(): void {}
 
    public start(): void {
        NotifyCenter.addListener(MSG_TEST_HTTP, (src: any, data: any) => {
            this.testHttp();
        }, this);
    }
 
    public testHttp(): void {
        let data = {
            mod: 1, // 模块
            cmd: 1, // 命令
        }
 
        let params: HttpReq = {
            path: "",
            method: HTTP_METHOD_GET
        }
 
        MainCtrl.inst.http.sendData(data, params, (data: NetData) => {
            World.inst.test = new TestData();
            World.inst.test.text = "123";
        }, (code: number, reason: string) => {});
    }
}

前面提到,C层还有一个全局单例的MainCtrl。该类主要负责模块注册、提供全局的操作接口(例如界面/场景的显隐)、网络通信处理。

 

MVC架构先说到这里,下一篇我们将介绍代码组织。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/houjia159/article/details/108450381

智能推荐

Jetson Nano - 实现VNC远程桌面控制_no such key enabled-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏60次。[Jetson Nano]如何实现VNC远程桌面控制本文教你如何实现VNC到你的Jetson Nano,这样就不需要连接屏幕来实现远程桌面控制啦。树莓派官方系统默认是安装了RealVNC的服务,只需在电脑上到RealVNC官方下载软件VNC Viewer,即可方便VNC实现树莓派远程桌面控制。然而……Jetson Nano就没这么直接了。事不宜迟,以下是搭建VNC服务的正式教程:1. 安装..._no such key enabled

物联网在智慧城市建设中的关键作用:连接、感知、智能响应_智慧城市 物联感知 问题-程序员宅基地

文章浏览阅读1k次,点赞14次,收藏6次。智慧城市是指通过运用先进的信息和通信技术,实现城市基础设施、公共服务、交通管理、环境保护等领域的智能化,以提升城市运行的效率和居民的生活质量。在获取了丰富的城市信息和数据后,物联网技术通过大数据分析和人工智能算法,可以对这些信息进行处理和分析,从而实现对城市运行状态的智能预测和决策。“方案365”全新整理智慧城市、数据治理、智慧农业、智慧应急、数字孪生、乡村振兴、智慧乡村、元宇宙、数据中台、智慧园区、智慧矿山、城市生命线、智慧水利、智慧校园、智慧工地、智慧农业、智慧旅游等300+行业全套解决方案。_智慧城市 物联感知 问题

把乐谱播出来,自制Arduino简谱播放库_arduion发声模块,播放乐谱-程序员宅基地

文章浏览阅读7.2k次,点赞6次,收藏15次。昨天我发了一章关于UNO+喇叭就可以播放歌曲的文章。文章到最后也没有完成整个天空之城歌曲。因为实在是太麻烦了。。于是今天就苦思冥想,想借此机会整理出一个简谱的播放程序。借此来播放所有简谱写成的歌曲。既能提高复用性,也很有趣。先来看看成果吧。 那么既然要写库,我们来一步步分析我们要完成的工作吧:1、如何把简谱用程序里的数据表示出来。_arduion发声模块,播放乐谱

【我的Python学习之旅】python语言基础 之 表达式和运算符(五)_python一个表达式中出现多种运算符时,按照小括号运算符、逻辑型、测试性、关-程序员宅基地

文章浏览阅读671次。表达式的组成表达式是可以计算的代码片段,由操作数和运算符构成。操作数、运算符和圆括号按一定的规则组成表达式。表达式通过运算后产生运算结果,返回结果对象。运算结果对象的类型由操作数和运算符共同决定。运算符表明对操作数进行什么样的运算。运算符包括十、一、、/等。操作数包括文本常量(没有名称的常数值,例如1、“abc”)、变量(例如i= 123)、类的成员变量/函数(例如math. pi.math..._python一个表达式中出现多种运算符时,按照小括号运算符、逻辑型、测试性、关

.NET Core C#系列之AKStream.NET摄像头国标GB28181语音对讲之广播请求(信令服务-->摄像头)...-程序员宅基地

文章浏览阅读562次。内容比较多,先一步步的讲吧。发送语音对讲之前,先发用对讲的信令。广播请求(信令服务-->摄像头)至于抓包分析,网上分享的很多了。其实都是发送Broadcast 广播通知,然后摄像头是广播通知应答,然后进行sdp 就行协议交换,可以简单理解成端口交换,其实就是音频流要推动到哪个端口,协商完毕,可以发送音频流。音频流发送结束,发送拜拜信令。整个流程就是如此,这里以https://github...._c#国标gb28181

嵌入式SQL语言-程序员宅基地

文章浏览阅读3.6k次。嵌入式SQL语言一、概述二、变量声明与数据库连接1、变量的声明与使用(1) 数据库与DBMS连接(2) 与数据库断开连接(3) SQL执行的提交与撤消(4) 事务的概念与特性三、数据集与游标1、**检索单行结果**2、检索多行结果3、游标(Cursor)的使用四、可滚动游标及数据库的增删改1、可滚动游标的概念、定义和使用2、数据的删除与更新3、数据库记录的更新4、数据库记录的插入5、示例:宿主语言与SQL结合的过程性控制五、状态捕获及错误处理机制一、概述高级语言+SQL语言既继承高级语言的过程控制性又_嵌入式sql

随便推点

html表格数据按自定义公式自动计算,Word表格中进行数据自动计算教程-程序员宅基地

文章浏览阅读2.6k次。方法一:直接输入域代码将插入点置于要存放结果的单元格中,按CTRL+F9插入域标识“{}”(注意:不能直接用键盘输入),在里面输入由“=”、函数、数值和单元格名称所组成的公式,然后在其上单击右键,选择“切换域代码”即可显示公式所计算的结果。方法二:“插入”→“域…”→“公式…”可以通过“插入”→“域…”,保持默认的域名选项,单击右侧的“公式…”按钮,同样也会出现“公式”对话框。方法三:利用“表格”..._html input 表格怎么设置计算公式

基于MPC的分布式驱动电动汽车变道轨迹跟踪控制及转矩分配的仿真效果分析-程序员宅基地

文章浏览阅读124次。通过联合使用Carsim和Matlab,我们能够精确地建立车辆模型,并实现有效的轨迹跟踪控制。在仿真过程中,我们设置了不同的环境条件和车辆参数,并评估了该方法在各种情况下的性能表现。通过这种分布式控制模型,我们能够实现多辆电动汽车之间的协同变道,以及良好的轨迹跟踪性能。MPC算法能够根据车辆的动态模型,预测未来一段时间内的车辆状态,并计算出最优的控制输入。在变道轨迹跟踪控制中,我们通过优化转向角、转矩分配等参数,使得车辆能够顺利变道,并且轨迹跟踪误差最小化。

Ubuntu18.04编译配置SGX-SSL(SGX支持的openssl函数库)_intel sgx ssl-程序员宅基地

文章浏览阅读1.2k次。预备PerlToolchain(正常这一步应该在编译SGX SDK和PSW准备阶段就完成了的,容易忽略,搭建SGX开发环境的时候最好别跳过)$ sudo cp external/toolset/{current_distr}/{as,ld,ld.gold,objdump} /usr/local/bin$ which as ld ld.gold objdumpIntel SGX driver、SDK和PSW准备好OpenSSL源码压缩包openssl-${version}.tar.gz。截_intel sgx ssl

vue跨域 使用 http-proxy-middleware 代理解决(项目使用vue-cli3.0搭建)_vue http-proxy-middleware-程序员宅基地

文章浏览阅读3.9k次。vue跨域 使用 http-proxy-middleware 代理解决(项目使用vue-cli3.0搭建)最近在模仿用Vue来搭建一个音乐播放器,用的是最新Vue.cli3来进行搭建的,要从QQ音乐来获取数据,那在之前的方法是用node的express框架起了一个服务设置了跨域,这种方法适用于vue2.x,那么在vux.3.0中呢,项目结构的目录是这样滴所以呢,不能像在vue2.0里面有个b..._vue http-proxy-middleware

linux中普通用户修改密码出现(passwd:Authentication token manipulation error)-程序员宅基地

文章浏览阅读2.8k次。如果在linux中,不管是root用户还是普通用户登录后,修改自己的密码,出现---passwd:Authentication token manipulation error---错误的解决办法:root自己修改密码失败普通用户修改密码失败1.报这样的错误是:密码:身份验证令牌操作错误,一般是密码文件的权限的问题,不过也有可能是根目录空间满用lsattr命令..._linux 为什么普通用户无法使用passwd修改密码。

Halcon dyn_threshold详解_halcon dyn_threshold-程序员宅基地

文章浏览阅读7.8k次,点赞11次,收藏30次。dyn_threshold原型dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )功能利用局部阈值分割图像参数列表OrigImage (input_object):原始图像ThresholdImage (input_object):处理后图像(一般采用滤波处理)RegionDynThresh (output_object):分割后区域Offset (input_control):灰_halcon dyn_threshold

推荐文章

热门文章

相关标签