cocos2dx游戏如何架构
声明:此篇文章不介绍如何使用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
我的软件结构里
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 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg
1 游戏逻辑架构 具体介绍 A 一个导演同一时间仅仅能执行一个场景,场景其中,能够同一时候载入多个层,一个层能够可载多个精灵.层中亦能够加层. B 场景切换 sceneàaddChild(la ...
- Cocos2d-x游戏导出android工程,提取cocos的so文件
Cocos2d-x游戏导出android工程,提取cocos的so文件 原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件, 使用ndk ...
- cocos2d-x游戏引擎核心之九——跨平台
一.cocos2d-x跨平台 cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和Android为例. 1. 跨平台项目目录结构 先看一下一个项目创建后的目录结构吧!这还是以HelloCpp ...
- 转载: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 ...
- [转]eoe社区cocos2d-x游戏引擎知识大汇总
[eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...
- 泡泡堂、QQ堂游戏通信架构分析
http://blog.csdn.net/sodme/article/details/468327#comments ————————————————————————————————————————— ...
- cocos2d-x游戏是怎么跑起来的
虽然cocos2d-x v3.0 alpha版已经出来了,也改进了不少,有兴趣的可以去尝尝鲜.因为后面可能还会配合cocoStudio写一下博客,而现在v1.0.0.0版本需要配合cocos2d-x ...
- cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发
cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622 ...
- Cocos2d-x游戏中默认的AndroidManifest.xml的解析
直接上代码说明: <?xml version="1.0" encoding="utf-8"? > <!-- xmlns:android=&qu ...
随机推荐
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- Oracle VM VirtualBox启动新建虚拟机弹错--不能为虚拟机xxxx电脑 打开一个新任务
有三种方案: 1.先在任务管理器中关掉所有virtualBox的进程,然后进入到C:\Users\Administrator\VirtualBox VMs\ 将相应guest的文件夹随便改个名字,再重 ...
- 转3xian之所在 (一位ACM大牛的博文)
3xian的经历和见解...我深思... 最后一天,漫天飘起了雪花,假装欢送我离去. 这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong A ...
- 使用x-template 定义模板
demo <script type="text/x-template" id="myFirstScriptComponent"> <p> ...
- hdu6035
树形dp 并没有想出来... 这个点分治很明显做不了,没办法批量处理信息,那么我们就只能考虑树形dp了,然后觉得用虚树什么的每个颜色单独考虑,GG 事实上我们可以这样考虑,我们对树进行dfs,每个节点 ...
- mysqlnd cannot connect to MySQL 4.1+ using old authentication
报这个错误主要是因为mysql使用了老的密码格式,而程序要求使用新的格式导致的,解决办法: SET old_passwords = 0; UPDATE mysql.user SET Password ...
- Struts Filter告警:FilterDispatcher <<< is deprecated! Please use the new filters!
在struts2.3.14下,web.xml中使用 <filter> <filter-name>struts2</filter-name> <!-- < ...
- E20180206-E
fundamental adj. 基础的,基本的,根本的,重要的,原始的,主要的,十分重大的; [物] 基频的,基谐波的; [乐] 基音的; n. 原理,原则,基本,根本,基础; [乐] 基音; ...
- Taro 采坑日常
组件事件传参只能在类作用域下的确切引用(this.handleXX || this.props.handleXX),或使用 bind. 组件中点击事件如下 // 组件 <AtListItem k ...
- vue按需加载组件,异步组件
说实话,我一开始也不知道什么叫按需加载组件,组件还可以按需加载???后来知道了 学不完啊...没关系,看我的 按需加载组件,或者异步组件,主要是应用了component的 is 属性 template ...