声明:此篇文章不介绍如何使用cocos2dx制作游戏。站在架构师的角度如果制作游戏。

以我多年的游戏开发经验,和其他技术积累, 市面的所谈的一些软件架构模式都不太适合游戏软件。

我指的架构模式,MVC、MVP、MVVM、MVI。  他们只适合应用软件里,以数据为主导的,显示为辅的功能性软件里。

web应用如 淘宝,或者某某管理后台, 都是数据为主导,有一堆商品数据,用户信息数据。网页上做的事情基本上概括为增删改查,

大部分应该没有这样需求吧, 10个按钮中,可以随意拖动按钮,然后下次进入时,在按照用户拖动后顺序显示出来。

假定拖动是在一个小容器中,那么推动的过程还需要检测位置信息然后进行设置位置信息。 一个物体的变化,引起周边UI的变化。

我举这个例子,是想强调大部分WEB应用都不是UI强交互型的。包括大部分软件。

应用型软件上属于功能性软件,比如拍照,记事本,聊天。

游戏软件特性特点:

需要和用户实时交互,UI渲染,核心主要界面表现层和游戏玩法上,而游戏玩法成千上万

游戏玩法往往和界面紧密相连,比如麻将游戏,手上有14张牌,玩家打了一张牌,如何知道玩家打的是什么什么牌,

我相信百分九十游戏程序员,应该会直接 ui.cardValue   类似这样的方式吧。

再比如创建房间面板,

经过一堆选项设置之后,你如何清楚的知道用户选择的是什么。不可否认,这个可以按照MVC或者MVP模式或其他来设计。

但是你经常需要思考,Model是里面有哪些数据,应该有哪些行为。 控制器会有几十事件监听,view可以交给cocos studio工具,但是也需要定义很多状态改变的东西。

游戏软件基本上属于交互式软件。经常操作手机屏幕控制UI显示。

我总结了几个游戏开发中经常需要解决的几个点:

1,某个事件产生时,UI当前的数据

2,某个事件产生时,UI在当前场景的位置

3,某个事件产生时,UI相对其他UI的位置。

4,重启场景,需要完全恢复愿状态,如何设计【重启APP】

5,某个事件产生,记录所有UI的状态 【点击创建创建,保存用户选择,下一次进入该面板,直接上一次退出时状态】

5,一个UI操作变化,引起周边UI联动变化 【某个英雄发动技能,身边怪物都掉血或者死亡】

cocos2dx 引擎提供功能

声音引擎

渲染引擎

网络工具库

物理引擎

其他一些小工具库,xml, json等等

我现在抛开声音,网络,小工具等这些不谈,只讲渲染引擎。 因为这才是核心。 当然一个游戏,不仅只有显示。

几个基础: Node,Scene,Layer

我抽象了引擎,总结就几句话

while(!isStop){

发送事件

绘制scene

}

没错,这是核心。咱们写的游戏逻辑,基本上上都是绘制scene里完成的。包括js和lua逻辑的执行(声音,网络请求,下载等除外)

遍历该scene下的所有节点,然后绘制。

游戏引擎本身是UI驱动的, 有的人,非要按照MVC,MVP等非UI交互型的模式,这无疑增加了工作量,也不便于理解。

搞不好一个新招的同事,为了快速完成任务,直接把这个模式给玩砸了。

我不否认,这些模式其实都是比较好的,但用在游戏开发真心不合适。

现在我只谈cocos2dx-lua的开发架构模式.

我把scene当作是一个虚拟机。 实现了一个观察者模式  用来通知其他layer层,或者所有layer层。

有一个限制,禁止layer:addChild( layer ).    虽然引擎支持这种。 所有layer都是兄弟姐妹的关系,不存在父亲儿子。

如果要实现那种点击一个按钮,弹出一个界面的功能, 这个界面不应该做成node或UIPanel节点,因为可能要屏蔽事件的。

虽然两者都支持,为了统一管理和逻辑实现,统一layer。

runScene 相当于启动一个虚拟机。很显而易见,同一时刻,只能运行一个scene,这是引擎的特性。

全局的事件中心用引擎提供的功能。

function onEvent(event)

end

layer._listener1 = cc.EventListenerCustom:create("component game over", onEvent)
local eventDispatcher = cc.Director:getInstance():getEventDispatcher()
eventDispatcher:addEventListenerWithFixedPriority(layer._listener1, 1)
 
-- send event
cc.Director:getInstance():getEventDispatcher():dispatchCustomEvent("component game over")
 

我的软件结构里

views

  scenes

    LoginScene.lua

    MainScene.lua

    GameScene.lua

  layers

    LoginbgLayer.lua

    LoginLayer.lua

    CommonDialog.lua

  nodes

    headNode.lua

自己实现一个

Game.Layer(csbFileName).   他继承cc.Layer.create()

Game.Scene(). 他继承 cc.Scene.create() 并实现一个观察者模式的简单模型。

这个模式并非游戏全局,仅仅供layer层直接传递信息。 runScene("xxxScene")是产生。

一切逻辑都写在layer, 此layer是cc.Layer.create()子类。

----

20190406补充:

才发现我想描述的其实的就是ECS架构。  原来早就有了,才发现这个架构。

看来我也不用继续在描述了

cocos2dx游戏如何架构的更多相关文章

  1. 1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

     1 游戏逻辑架构 具体介绍 A 一个导演同一时间仅仅能执行一个场景,场景其中,能够同一时候载入多个层,一个层能够可载多个精灵.层中亦能够加层. B  场景切换 sceneàaddChild(la ...

  2. Cocos2d-x游戏导出android工程,提取cocos的so文件

      Cocos2d-x游戏导出android工程,提取cocos的so文件   原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件, 使用ndk ...

  3. cocos2d-x游戏引擎核心之九——跨平台

    一.cocos2d-x跨平台 cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和Android为例. 1. 跨平台项目目录结构 先看一下一个项目创建后的目录结构吧!这还是以HelloCpp ...

  4. 转载:Cocos2D-x 游戏接入 Windows 设备所需做的六件事

    原文地址:http://msopentech.com/zh-hans/blog/2014/05/09/cocos2d-x-%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%85%A5-wi ...

  5. [转]eoe社区cocos2d-x游戏引擎知识大汇总

    [eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...

  6. 泡泡堂、QQ堂游戏通信架构分析

    http://blog.csdn.net/sodme/article/details/468327#comments ————————————————————————————————————————— ...

  7. cocos2d-x游戏是怎么跑起来的

    虽然cocos2d-x v3.0 alpha版已经出来了,也改进了不少,有兴趣的可以去尝尝鲜.因为后面可能还会配合cocoStudio写一下博客,而现在v1.0.0.0版本需要配合cocos2d-x ...

  8. cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发

     cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622     ...

  9. Cocos2d-x游戏中默认的AndroidManifest.xml的解析

    直接上代码说明: <?xml version="1.0" encoding="utf-8"? > <!-- xmlns:android=&qu ...

随机推荐

  1. 软件开发-MSF方法(《构建之法》读书笔记2)

    MSF-微软解决方案框架,是一套大型系统开发指南,它描述了如何用组队模型.过程模型和应用模型来开发Client/Server结构的应用程序,是在微软的工具和技术的基础上建立并开发分布式企业系统应用的参 ...

  2. luogu 3960 列队

    noip2017 D2T3 列队 某zz选手当时直接放弃了写了50还写错了 题目大意: 有一个n行m列的方阵,第i行j列的点编号为(i-1)m+j 每次把第x行y列的点拿出来,然后把这一行它之后的点都 ...

  3. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

  4. P3755 [CQOI2017]老C的任务

    传送门 可以离线,把询问拆成四个,然后把所有的按\(x\)坐标排序,这样就只要考虑\(y\)坐标了.然后把\(y\)坐标离散化,用树状数组统计即可 记得开longlong //minamoto #in ...

  5. 只需3步,即可将你的Chromium Edge 浏览器设置成中文

    最近,Chromium Edge 浏览器推出了添加语言包的功能,于是我们可以轻松将其界面设置成中文的. 第1步: 升级浏览器到最新版 在Chromium Edge 浏览器的地址栏中输入: edge:/ ...

  6. hdu---------3189-------------------

    水体一个,但是这种做题的方法值得发扬光大............ Just Do It Time Limit: / MS (Java/Others) Memory Limit: / K (Java/O ...

  7. python正则表达式_总结

    正则表达式: 作用:正则表达式是用来查找字符串的. 之前:使用正则表达式首先要导入re模块(import re) re.match -- 从字符串的第一个单词开始匹配字符串.如果匹配到则返回一个对象: ...

  8. 进击的Python【第七章】:python各种类,反射,异常处理和socket基础

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  9. python爬取网页图片(二)

    从一个网页爬取图片已经解决,现在想要把这个用户发的图片全部爬取. 首先:先找到这个用户的发帖页面: http://www.acfun.cn/u/1094623.aspx#page=1 然后从这个页面中 ...

  10. MyEclipse2014+Maven配置记录

    一.MyEclipse配置Maven 打开MyEclipse2014,选择菜单:Window --> Preferences,选择:MyEclipse-Maven4MyEclipse-Insta ...