Cocos2d-x项目的MVC框架

Cocos2d-x项目的MVC框架

本篇所用的Cocos2d-x版本为:Cocos2d-x 3.2

当我们已经开始搭建好项目,着手开始写代码的时候,我想同学们肯定会遇到这样的一个问题:

某些UI类在加载到父级上之后,经常毫无原由的造成崩溃现象。或者代码写了好几千行,难以进行维护及其他人帮助处理等。这是为什么呢?

其实,就是因为2点:

  • 你对Cocos2d-x还是不够了解
  • 你没有框架的概念

其实,这种问题往往是因为,你子级元素在父级addchild之前,就开始调用到了父级元素。或者说你就一直埋头去写,根本没有去想到底该怎么写。

我以前在交流群里经常对遇到这种问题的同学这么说:“你孩子还在母亲肚子里没生出来呢,你让它去打酱油可能吗?”

“你的孩子应该有无限的未来,为什么你不给它好好的去规划未来,而直接就开始给它戴上紧箍咒,让它束手束脚?”

我以前初学Cocos2d-x的时候经常会遇到的一个误区。那就是 在init函数里添加了显示UI或需要父级的数据等。

其实在init里面添加显示UI的代码,并没有问题,但是对于我的编程经历上来讲,这并不好,我个人认为你初始化就应该做初始化的事,你的UI就应该在UI的函数里进行加载,逻辑就应该在逻辑函数内,而不是哪地方都是。

我想了解MVC框架的同学们,都清楚MVC到底是什么了,那么我引用一下度娘对MVC的定义

MVC
全名是Model View
Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面
显示分离的方法组织代码,将业务逻辑*****到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起
来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

在我一开始得知MVC框架的时候,我也纠结了很久,对于小项目来说这种框架非常的消耗时间,往往在一个类里面就可以搞定的东西,非要分成4份,管理器、业务、UI、逻辑。在这里我只能说是仁者见仁,智者见智了。

我先说说这种框架的好处:

1、你可以很轻松的将以前的业务拿到任何的新项目中。

2、你可以在策划变更逻辑、美术改变UI后,不用重新对逻辑和业务做过多的修改。

3、你可以很轻松的找到问题的所在,代码鲜明、整洁、规范。

坏处:就是你会觉得很烦,明明一个非常简单的业务,非要写这么复杂。

那么将MVC框架运用到Cocos2d-x上,是什么样子呢?

首先同学们看一下我写的基类BaseLayer

根据我的个人经验,我赋予了BaseLayer这几个简单的函数:

1、初始化及数据读取

2、显示及加载UI

3、加载逻辑与返回逻辑

……

就像上述,inti()就只是负责初始化,而showUI()就只是负责显示及加载UI,加载与返回逻辑就负责逻辑处理。

那么我们对比MVC架构和BaseLayer来看:

  • 模型(model)————BaseLayer数据的初始化及本身业务
  • 视图(view)————BaseLayerUI的初始化及加载
  • 控制器(controller)————BaseLayer的逻辑处理及返回

那么BaseLayer的实现一般就是这样的步骤:

1、inti();

2、GetReadData();

3、LoadUILogic();

4、showUI();

5、ReturnLogic();

以实际功能业务为例:装备升级功能

我现在有个需求,需要实现对装备的升级功能。

我们以BaseLayer为基类,派生出业务类Equipment_LvUp (请原谅我小学英语毕业)。


1

2

3

4

5

Equipment_LvUp* m_pEquip = Equipment_LvUp::create();

this->addchild(m_pEquip);

m_pEquip->GetReadData(…);

m_pEquip->LoadUILogic (…);

m_pEquip->showUI ();


顺序上,我们不难看出,先初始化数据、然后获取业务必要数据、加载业务逻辑、显示业务视图UI我们这么做之后,如果发生问题可以轻松的去判断问题的所在,
是因为数据、显示、还是逻辑。而后,当我们的业务逻辑变更后,可以根据需求去调整代码,既鲜明,又直观。而且你可以把业务扔在不同的管理器下随时调用,可
谓是相当的方便。

而且我们还可以根据不同的需求,对它进步一再重构及功能提升。像资源的异步加载、业务算法优化等等这些功能就可以逐步的完善。也可以分写4个类,就像之前提到的管理器、业务、UI、逻辑分类写。这些方法用哪个都可以,这只是给你提供一个思想、一个方式而已。

MVC
框架我的理解,通俗点讲,就好比你玩英雄联盟,你的事件是通过鼠标及键盘进行响应的,也可以说是你的直观逻辑处理,QWER每次点击都会通过键盘映射到相
应的逻辑进行处理,逻辑处理完之后通知相关UI进行动画或者渲染等,然后UI再给你提供新的界面,以供你进行新的选择。

那么从Cocos2d-x的demo也不难看出这种框架模式

逻辑分离

根据逻辑引用计数的增加和减少采用不同的类进行处理

每个类只负责自身的显示及动画效果。

    • likexx2015-01-08 15:10:20

      晕死,mvc又不会是万能工
      具,model->view->controller这种结构适合事件驱动或者纯数据驱动的东西,网站、应用app都可以,游戏本身是
      main
      loop的结构啊亲,跟mvc压根是两个设计思路,你非要去为了套用mvc的思维去强行把这个加上去,除了多此一举之外,会导致很多游戏设计的实现变得异
      常繁琐---在应用开发中,有些繁琐是必要的,因为一个应用需要从小到大很多年的不断改进;但是游戏不同,游戏生命周期就一两年,之后就是维护,所以游戏
      的架构是效率第一,方便修改第一。

      支持(9)回复(2)

      DemonVV2015-01-13 12:35:18

      回复 likexx:这个确实,我也是纠结了很久,但是我觉得还是由必要的,因为编码者必须有一个架构思想,才能对今后的编程之路有帮助,所以我觉得,一开始对MVC有些了解还是好的。也谢谢您的建议,会对我今后的编程之路有很大的帮助!

      支持(1)回复

      风铃听见风2015-01-15 17:53:57

      回复 likexx:请举例不是main loop的应用程序, hello world除外, 不谢

      支持(6)回复

    • sgxiaolong2015-01-08 12:13:56

      mvc有个缺点是m,v不是分开的,v可以访问到m,但是m不能访问到v,所以就弱化了c的作用,所以我更趋向于mvp这个模式,数据传输模型 m->p->v 用户输入模型 v->p->m 这样就能把m、v解耦,p担当桥梁中间层

时间: 2024-11-08 17:17:08

Cocos2d-x项目的MVC框架的相关文章

【转】 Android项目的mvc模式

MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型M可以对于多种视图模型V,比如一批统计数据你可以分别用柱状图.饼图V来表示.一种视图模型V也可以对于多种逻辑模型M.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,而C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,这与<设计模式>中的观察者模式是完全一样. MVC好处:MVC把应用程序的逻辑层与界面是完全分开的,最大的好处是:界面设计

MVC框架中的值提供(一)

在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据来源抽象了IValueProvider接口; public interface IValueProvider { bool ContainsPrefix(string prefix); ValueProviderResult GetValue(string key); } IValueProvide

手把手编写自己的PHP MVC框架实例教程

1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). PHP中MVC模式也称Web MVC,从上世纪70年代进化而来. MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能. 除此之外,此模式通过对复杂度的简化,使程序结构更加直观. MVC各部分的职能: 模型Model – 管理大部分

.net的MVC框架

概述 MVC是一种思想,基于这个思想有了很多的框架,像java中的Struts,那么这个思想到底是什么呢? MVC思想 思想,也就是想法,要想知道这个想法是什么,就需要先知道这个想法因为什么产生了,要知道,没有无缘无故的恨,所以,想法也是不可能在没有任何因的情况下产生的,那么到底是什么触发了这个想法的产生,并且把它推到了高潮呢? 要想知道这个,首先,我们要分析一下在MVC真正到来之前,我们的Web编程世界的状况.当时的Web开发,主要以WebForm的开发模式,即以asp.net的事件驱动页面的

【JavsScript】JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember

摘要:选择JavaScript MVC框架很难.一方面要考虑的因素非常多,另一方面这种框架也非常多,而要从中选择一个合适的,还真得费一番心思.本文对JavaScript MVC框架Angular.Backbone.CanJS和Ember作了比较,供大家参考. 选择JavaScript MVC框架很难.一方面要考虑的因素非常多,另一方面这种框架也非常多,而要从中选择一个合适的,还真得费一番心思.想知道有哪些JavaScript MVC框架可以选择?看看 TodoMVC吧. 我用过其中4个框架:An

MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个更加清晰的认识. 本文原创地址:http://www.cnblogs.com/landeanfen/p/6000978.html 这篇博主打算从零开始一步一步来加上MVC里面用到的一些技术,整篇通过三个版本,逐步完善. 一.版本一:搭建环境,实现MVC请求 通过上篇的介绍,我们知道,MVC里面两个最

Struts MVC 框架 (让你一步步成为高手)

web应用的分层 交互层,表现数据,收集数据,也就是视图层,接受请求,通过处理层完成相应的响应.(V,C) 处理层,完成数据的处理,也就是业务层(M). MVC设计模式(应用观察者模式的框架模式) M model,模型,操作数据的业务处理层. V view,示图,采集和显示数据,为业务层提供数据,表现业务层输出的数据,只关心数据的类型,不管新数据的来源. C ctrl,控制器,也就是视图层和模型层桥梁,控制数据的流向,接受视图层发出的事件,并重绘视图. MVC框架的实现模型 模型一: JSP+J

[Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用

转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之外,也支持 JSR 168 Portlet 的开发.Spring Portlet MVC 框架尽可能多地继承了 Spring Servlet MVC 框架技术,使用了相同的底层表现层抽象和整合技术.同时,由于 JSR 168 Portlet 独特的工作流程,Spring Portlet MVC 框架

Android MVC框架模式

MCV  model view controller  模型-视图-控制写 M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理. V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果. C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入