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 ...
随机推荐
- Magic Grid ComboBox JQuery 版
在MagicCombo组件中嵌入Grid,以支持分页查找和跨页选取 1. 2. [代码][JavaScript]单选示例代码 <script type="text/jav ...
- HttpWebRequest以及HttpWebResponse
上次介绍了用WebClient的方式提交POST请求,这次,我继续来介绍用其它一种方式 HttpWebRequest以及HttpWebResponse 自认为与上次介绍的WebClient最大的不同之 ...
- 【Bitset】 BZOJ4810
难得学习一下C++的库..[至今连map,vector都没用过的我.. 首先#include<bitset>或<bits/stdc++.h> 定义函数: { bitset & ...
- AutoIT:为文件夹下面的文件批量改名
以前用Ruby脚本,对于中文,数字结合的文件名,修改名字也不是非常简单,需要修改字符集,可是用autoit来实现,也挺简单的,并且可以替换已有文件名中的汉字部分. $filepath = " ...
- VS2012上添加SharePoint2013模板,SharePoint2013 Tool安装配置
今天需要在SharePoint2013上做开发,但是安装的VS2012默认只有sharepoint2010的模板,因此需要安装配置好,这里我们通过Web平台安装程序4.0来配置的 Web 平台安装程序 ...
- asp.net mvc5 使用百度ueditor 本编辑器完整示例(下)配置上传播放视频
通过 asp.net mvc5 使用百度ueditor 本编辑器完整示例(上)介绍,可以上传图片到服务器了,也可以上传小的视频文件,并且由百度编辑器自动加入html5<video>标签播放 ...
- #!/usr/bin/env ruby 与 #!/usr/bin/ruby 的区别(copy)
[说明:资料来自http://blog.csdn.net/wh_19910525/article/details/8040494] 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执 ...
- mysql case 列名 when 和 case when的区别
最近写了一个sql,才发现有些情况不能用case 列名 when ( and then and and 7.9 then '中' else '差' END ) score_type, 我发现这样写查出 ...
- Springboot整合elasticsearch以及接口开发
Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...
- [AHOI2007]密码箱
Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可 ...