cocos2d-x : csb的加载
cocos2d-x : csb的加载
- csb的加载时通过 CSLoader 类加载的
先看 CSLoader.h 简单介绍几个函数
class CC_STUDIO_DLL CSLoader
{public:// 通过csb文件名 创建节点 例如:cocos2d::CSLoader::createNode("aaa.csb");static cocos2d::Node* createNode(const std::string& filename);// 通过文件名 创建时间线 序列帧 例如:cocos2d::CSLoader::createTimeline("aaa.csb");static cocostudio::timeline::ActionTimeline* createTimeline(const std::string& filename);// 通过json文件名 创建节点 例如:cocos2d::CSLoader::createNode("aaa.csb");cocos2d::Node* createNodeFromJson(const std::string& filename);// 从文件中 获取到数据 buffer 初始化textures要用到的testure都放入SpriteFrameCache里// 获得NodeTreecocos2d::Node* createNodeWithFlatBuffersFile(const std::string& filename);// 将nodeTree里的节点递归调用此方法渲染出来cocos2d::Node* nodeWithFlatBuffers(const flatbuffers::NodeTree* nodetree, const ccNodeLoadCallback &callback);// load nodescocos2d::Node* loadSimpleNode(const rapidjson::Value& json);cocos2d::Node* loadSubGraph (const rapidjson::Value& json);cocos2d::Node* loadSprite (const rapidjson::Value& json);cocos2d::Node* loadParticle (const rapidjson::Value& json);cocos2d::Node* loadTMXTiledMap(const rapidjson::Value& json);// load guicocos2d::Node* loadWidget(const rapidjson::Value& json);// load componentcocos2d::Component* loadComponent(const rapidjson::Value& json);cocos2d::Component* loadComAudio(const rapidjson::Value& json);bool isWidget(const std::string& type);bool isCustomWidget(const std::string& type);// 获得渲染节点的类名std::string getGUIClassName(const std::string &name);// 获得WidgetReader渲染器的类名std::string getWidgetReaderClassName(cocos2d::ui::Widget *widget);
};
代码里面加载csb
cocos2d::Node* root = cocos2d::CSLoader::createNode("aaa.csb");createNodeWithFlatBuffersFile(filename);createNodeWithFlatBuffersFile(filename, nullptr);nodeWithFlatBuffersFile(filename, callback);Node* CSLoader::nodeWithFlatBuffersFile(const std::string &fileName, const ccNodeLoadCallback &callback)
{std::string fullPath = FileUtils::getInstance()->fullPathForFilename(fileName);CC_ASSERT(FileUtils::getInstance()->isFileExist(fullPath));// 通过FileUtils类读取 csb里的内容保存到data中 里面使用的是文件操作打开文件、读取文件、关闭文件Data buf = FileUtils::getInstance()->getDataFromFile(fullPath);auto csparsebinary = GetCSParseBinary(buf.getBytes()); 【1】auto csBuildId = csparsebinary->version();if (csBuildId){}// decode plistauto textures = csparsebinary->textures();int textureSize = textures->size();for (int i = 0; i < textureSize; ++i){SpriteFrameCache::getInstance()->addSpriteFramesWithFile(textures->Get(i)->c_str());}Node* node = nodeWithFlatBuffers(csparsebinary->nodeTree(), callback); 【2】return node;
}
【1】解析: GetCSParseBinary(buf.getBytes()) 此方法是在CSParseBinary_generated.h文件里的
inline const flatbuffers::CSParseBinary *GetCSParseBinary(const void *buf) {return flatbuffers::GetRoot<flatbuffers::CSParseBinary>(buf);
}
// 此方法会返回一个结构体
struct CSParseBinary FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {enum {VT_VERSION = 4,VT_TEXTURES = 6,VT_TEXTUREPNGS = 8,VT_NODETREE = 10,VT_ACTION = 12,VT_ANIMATIONLIST = 14};const flatbuffers::String *version() const { return GetPointer<const flatbuffers::String *>(VT_VERSION); }const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *textures() const { return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TEXTURES); }const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *texturePngs() const { return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TEXTUREPNGS); }const NodeTree *nodeTree() const { return GetPointer<const NodeTree *>(VT_NODETREE); }const NodeAction *action() const { return GetPointer<const NodeAction *>(VT_ACTION); }const flatbuffers::Vector<flatbuffers::Offset<AnimationInfo>> *animationList() const { return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<AnimationInfo>> *>(VT_ANIMATIONLIST); }bool Verify(flatbuffers::Verifier &verifier) const {return VerifyTableStart(verifier) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_VERSION) &&verifier.Verify(version()) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_TEXTURES) &&verifier.Verify(textures()) &&verifier.VerifyVectorOfStrings(textures()) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_TEXTUREPNGS) &&verifier.Verify(texturePngs()) &&verifier.VerifyVectorOfStrings(texturePngs()) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_NODETREE) &&verifier.VerifyTable(nodeTree()) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_ACTION) &&verifier.VerifyTable(action()) &&VerifyField<flatbuffers::uoffset_t>(verifier, VT_ANIMATIONLIST) &&verifier.Verify(animationList()) &&verifier.VerifyVectorOfTables(animationList()) &&verifier.EndTable();}
};
【2】解析:递归调用nodeWithFlatBuffers(csparsebinary->nodeTree(), callback);把所有的节点渲染出来
渲染类
Node* CSLoader::nodeWithFlatBuffers(const flatbuffers::NodeTree *nodetree, const ccNodeLoadCallback &callback)
{if (nodetree == nullptr)return nullptr;{Node* node = nullptr;std::string classname = nodetree->classname()->c_str();auto options = nodetree->options();if (classname == "ProjectNode"){}else if (classname == "SimpleAudio"){}else{std::string customClassName = nodetree->customClassName()->c_str();if (customClassName != ""){classname = customClassName;}// getGUIClassName(classname);获得渲染的名称 比如classname = "Node"std::string readername = getGUIClassName(classname);readername.append("Reader"); // readername = NodeReader// 从这些渲染类中生成对应的对象 reader NodeReaderProtocol* reader = dynamic_cast<NodeReaderProtocol*>(ObjectFactory::getInstance()->createObject(readername));if (reader){node = reader->createNodeWithFlatBuffers((const flatbuffers::Table*)options->data());【3】}}auto children = nodetree->children();int size = children->size();for (int i = 0; i < size; ++i){auto subNodeTree = children->Get(i);//递归把所有的子节点全部渲染出来Node* child = nodeWithFlatBuffers(subNodeTree, callback);}return node;}
}
【3】解析:createNodeWithFlatBuffers
比如NodeReader渲染器
void NodeReader::setPropsWithFlatBuffers(cocos2d::Node *node,const flatbuffers::Table* nodeOptions){auto options = (WidgetOptions*)(nodeOptions);std::string name = options->name()->c_str();float x = options->position()->x();float y = options->position()->y();float scalex = options->scale()->scaleX();float scaley = options->scale()->scaleY();// float rotation = options.rotation();float rotationSkewX = options->rotationSkew()->rotationSkewX();float rotationSkewY = options->rotationSkew()->rotationSkewY();float anchorx = options->anchorPoint()->scaleX();float anchory = options->anchorPoint()->scaleY();int zorder = options->zOrder();int tag = options->tag();int actionTag = options->actionTag();bool visible = options->visible() != 0;float w = options->size()->width();float h = options->size()->height();int alpha = options->alpha();Color3B color(options->color()->r(), options->color()->g(), options->color()->b());std::string customProperty = options->customProperty()->c_str();node->setName(name);node->setPosition(Point(x, y));if(scalex != 1)node->setScaleX(scalex);if(scaley != 1)node->setScaleY(scaley);if (rotationSkewX != 0)node->setRotationSkewX(rotationSkewX);if (rotationSkewY != 0)node->setRotationSkewY(rotationSkewY);if(anchorx != 0.5f || anchory != 0.5f)node->setAnchorPoint(Point(anchorx, anchory));if(zorder != 0)node->setLocalZOrder(zorder);if(visible != true)node->setVisible(visible);node->setContentSize(Size(w, h));if (alpha != 255)node->setOpacity(alpha);node->setColor(color);node->setTag(tag);ComExtensionData* extensionData = ComExtensionData::create();extensionData->setCustomProperty(customProperty);extensionData->setActionTag(actionTag);if (node->getComponent(ComExtensionData::COMPONENT_NAME)){node->removeComponent(ComExtensionData::COMPONENT_NAME);}node->addComponent(extensionData);node->setCascadeColorEnabled(true);node->setCascadeOpacityEnabled(true);setLayoutComponentPropsWithFlatBuffers(node, nodeOptions);}
cocos2d-x : csb的加载相关推荐
- Cocos-2d 游戏进度条加载CCProgressTimer实现
游戏开发中难免用到进度条,例如做一些游戏技能的CD时间等都会使用到:那么cocos2d当然也封装了进度条,但是不太理想,如果童鞋们用过就应该知道,那么今天介绍两个知识点,第一:介绍cocos2d中的进 ...
- cocos2d-x 图片纹理优化 资源加载方案
原文地址:http://blog.sina.com.cn/s/blog_64d591e80101me1y.html 文章主要解决了我一直以来疑惑的几个问题 1.到底用不用2的N次幂的图片 2.为什么加 ...
- cocos studio 制作csd动画文件 并 加载使用嵌套动画
直接使用cocos studio 制作动画,动画过程细腻,可以根据自己的想法方便调节.并且可以随意取用. 本次记录是我需要一个头像动画,放在不同的头像上,而且头像的大小各不相同. 解决方案就是: 1. ...
- Cocos2d之Texture2D类详解之将文件加载成Texture2D对象
一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...
- cocos2d 使用SimpleAudioEngine加载音乐音效
游戏音乐与音效 cocos2d中使用SimpleAudioEngine可以很简单的播放背景音乐和音效 背景音乐默认是循环播放的,音效默认是播放一次,而且一般情况音效都是很短的. 下面我们首先来分析一下 ...
- cocostudio导出数据在代码中加载
使用cocos v2.x发布的CSB资源更换了加载方式,需要用CSLoader来加载.目前的cocos支持的语言有C++.js.lua, 编辑器默认导出的格式为csb.json,下面来分语言介绍 ...
- cocos2d-x 3.8.1的骨骼动画加载方法addArmatureFileInfo仍然存在问题
提出如题所示的问题,心里非常别扭,但的确是事实.因此,Cocos Studio(我目前使用的是 2.3.2)在许多方面还有改进的地方,包括与之相对应的cocos2d-x中的代码操作部分. 问题 目前, ...
- cocos2dx 大地图分块加载的研究(初)
本文转自http://blog.csdn.net/dinko321/article/details/46739563 项目里面需要加载一个很大的地图,目测最少是4096x4096的分辨率. 先不考虑什 ...
- cocos2x (c++/lua) spine 文件的预加载
在之前,笔者写过一编博客,通过lua在加载场景加载spineAnimation动画精灵,保存在table中,然后在游戏中创建动画精灵时,提取加载好的spineAnimaiton中的 spSkeleto ...
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略
前段时间cocos2dx更新了最新版本cocos2d2.0x2.0.2,也从这个版本开始对于资源加载与管理都改变了策略. 在之前的加载方式都是通过沿用与cocos2d-iphone一样的加载资源 ...
最新文章
- brave浏览器_兼容Chrome 插件的Brave浏览器,带给你更快速的上网冲浪体验
- 一个简单的blog系统(九) 增加标签和标签页面
- java 配置参数_给你的JAVA程序配置参数(Properties的使用)
- C++简介源码讲解精辟版,C++入门级C++学习,C++与C的区别值得知晓
- java while语句_Java while循环
- mysql 常用的列类型_MySQL 常用列类型
- URL vs URI
- 自定义验证之整数(包括0和负数)
- 基于HTTP协议的轻量级开源简单消息队列服务:HTTPSQS
- Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言	1 1.1. 资料数量在百度内的数量对比	1 1.2. 版本16 v15.6.1	1 1.3. 引入js	2
- 【图像增强】基于脉冲神经网络PCNN实现图像增强附matlab代码
- 大智慧加密指标源码恢复,指标破解工具
- 屏幕录制专家linux版,录屏大师免费版下载-录屏大师全新下载V3.5.3-Linux公社
- 2021年海洋工程装备行业发展研究报告
- 【StringBuffer】
- RaspberryPi 3B 之初体验笔记(续一)
- 用户需求说明书-模板(referrence)
- Large-Scale and Language-Oblivious Code Authorship Identification
- 【ppt课件制作】Focusky教程 | 字体选择
- php interface的设计,【PHP、設計模式、大頭菜】流暢介面 Fluent Interface
热门文章
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 英语专业跨计算机考研方向,对于一些英语专业考研有哪些的选择方向
- 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day4)
- linux xia复制命令,Linux常用命令整理
- matlab求刚度,求整体刚度矩阵matlab程序
- 如何清理C盘空间垃圾?一键清理系统垃圾保障Windows快速运行
- 计算机网络 网络安全问题概述
- dfs——xy省赛选拔题——问题 E: 整数凑和问题
- LeetCode——四数之和
- 经典算法题-----猴子吃桃的问题