经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
cocos creator主程入门教程(七)—— MVC架构
来源:cnblogs  作者:五邑隐侠  时间:2019/2/25 9:10:28  对本文有异议

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑。本系列文章以TypeScript为介绍语言。

 

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

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

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

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

 

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

  1. export class World {
  2. private static instance: World = null;
  3.  
  4. private _test: TestData = null;
  5.  
  6. /**
  7. * 单例模式
  8. */
  9. private constructor() {
  10.  
  11. }
  12.  
  13. /**
  14. * 获取实例
  15. */
  16. public static get inst(): World {
  17. if (!World.instance) {
  18. World.instance = new World();
  19. }
  20.  
  21. return World.instance;
  22. }
  23.  
  24. // FOR TEST
  25. public set test(val: TestData) {
  26. this._test = val;
  27. }
  28.  
  29. public get test(): TestData {
  30. return this._test;
  31. }
  32. }

  

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

 

  1. export class TestData {
  2. private _text: string = null;
  3.  
  4. public constructor() {
  5.  
  6. }
  7.  
  8. public set text(val: string) {
  9. this._text = val;
  10. }
  11.  
  12. public get text(): string {
  13. return this._text;
  14. }
  15. }

  

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

 

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

 

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

  1. const {ccclass, property} = cc._decorator;
  2.  
  3. @ccclass
  4. export default class TestViewCtrl extends ViewCtrl {
  5. }

 

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

  1. export class TestCtrl {
  2.  
  3. public constructor() {
  4.  
  5. }
  6.  
  7. public init(): void {}
  8.  
  9. public start(): void {
  10. NotifyCenter.addListener(MSG_TEST_HTTP, (src: any, data: any) => {
  11. this.testHttp();
  12. }, this);
  13. }
  14.  
  15. public testHttp(): void {
  16. let data = {
  17. mod: 1, // 模块
  18. cmd: 1, // 命令
  19. }
  20.  
  21. let params: HttpReq = {
  22. path: "",
  23. method: HTTP_METHOD_GET
  24. }
  25.  
  26. MainCtrl.inst.http.sendData(data, params, (data: NetData) => {
  27. World.inst.test = new TestData();
  28. World.inst.test.text = "123";
  29. }, (code: number, reason: string) => {});
  30. }
  31. }

  

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

 

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

原文链接:http://www.cnblogs.com/niudanshui/p/10422307.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号