cocos2d-x  : csb的加载
  1. 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的加载相关推荐

  1. Cocos-2d 游戏进度条加载CCProgressTimer实现

    游戏开发中难免用到进度条,例如做一些游戏技能的CD时间等都会使用到:那么cocos2d当然也封装了进度条,但是不太理想,如果童鞋们用过就应该知道,那么今天介绍两个知识点,第一:介绍cocos2d中的进 ...

  2. cocos2d-x 图片纹理优化 资源加载方案

    原文地址:http://blog.sina.com.cn/s/blog_64d591e80101me1y.html 文章主要解决了我一直以来疑惑的几个问题 1.到底用不用2的N次幂的图片 2.为什么加 ...

  3. cocos studio 制作csd动画文件 并 加载使用嵌套动画

    直接使用cocos studio 制作动画,动画过程细腻,可以根据自己的想法方便调节.并且可以随意取用. 本次记录是我需要一个头像动画,放在不同的头像上,而且头像的大小各不相同. 解决方案就是: 1. ...

  4. Cocos2d之Texture2D类详解之将文件加载成Texture2D对象

    一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...

  5. cocos2d 使用SimpleAudioEngine加载音乐音效

    游戏音乐与音效 cocos2d中使用SimpleAudioEngine可以很简单的播放背景音乐和音效 背景音乐默认是循环播放的,音效默认是播放一次,而且一般情况音效都是很短的. 下面我们首先来分析一下 ...

  6. cocostudio导出数据在代码中加载

     使用cocos v2.x发布的CSB资源更换了加载方式,需要用CSLoader来加载.目前的cocos支持的语言有C++.js.lua, 编辑器默认导出的格式为csb.json,下面来分语言介绍 ...

  7. cocos2d-x 3.8.1的骨骼动画加载方法addArmatureFileInfo仍然存在问题

    提出如题所示的问题,心里非常别扭,但的确是事实.因此,Cocos Studio(我目前使用的是 2.3.2)在许多方面还有改进的地方,包括与之相对应的cocos2d-x中的代码操作部分. 问题 目前, ...

  8. cocos2dx 大地图分块加载的研究(初)

    本文转自http://blog.csdn.net/dinko321/article/details/46739563 项目里面需要加载一个很大的地图,目测最少是4096x4096的分辨率. 先不考虑什 ...

  9. cocos2x (c++/lua) spine 文件的预加载

    在之前,笔者写过一编博客,通过lua在加载场景加载spineAnimation动画精灵,保存在table中,然后在游戏中创建动画精灵时,提取加载好的spineAnimaiton中的 spSkeleto ...

  10. 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略

    前段时间cocos2dx更新了最新版本cocos2d­2.0­x­2.0.2,也从这个版本开始对于资源加载与管理都改变了策略. 在之前的加载方式都是通过沿用与cocos2d-iphone一样的加载资源 ...

最新文章

  1. brave浏览器_兼容Chrome 插件的Brave浏览器,带给你更快速的上网冲浪体验
  2. 一个简单的blog系统(九) 增加标签和标签页面
  3. java 配置参数_给你的JAVA程序配置参数(Properties的使用)
  4. C++简介源码讲解精辟版,C++入门级C++学习,C++与C的区别值得知晓
  5. java while语句_Java while循环
  6. mysql 常用的列类型_MySQL 常用列类型
  7. URL vs URI
  8. 自定义验证之整数(包括0和负数)
  9. 基于HTTP协议的轻量级开源简单消息队列服务:HTTPSQS
  10. Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
  11. 【图像增强】基于脉冲神经网络PCNN实现图像增强附matlab代码
  12. 大智慧加密指标源码恢复,指标破解工具
  13. 屏幕录制专家linux版,录屏大师免费版下载-录屏大师全新下载V3.5.3-Linux公社
  14. 2021年海洋工程装备行业发展研究报告
  15. 【StringBuffer】
  16. RaspberryPi 3B 之初体验笔记(续一)
  17. 用户需求说明书-模板(referrence)
  18. Large-Scale and Language-Oblivious Code Authorship Identification
  19. 【ppt课件制作】Focusky教程 | 字体选择
  20. php interface的设计,【PHP、設計模式、大頭菜】流暢介面 Fluent Interface

热门文章

  1. 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
  2. 英语专业跨计算机考研方向,对于一些英语专业考研有哪些的选择方向
  3. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day4)
  4. linux xia复制命令,Linux常用命令整理
  5. matlab求刚度,求整体刚度矩阵matlab程序
  6. 如何清理C盘空间垃圾?一键清理系统垃圾保障Windows快速运行
  7. 计算机网络 网络安全问题概述
  8. dfs——xy省赛选拔题——问题 E: 整数凑和问题
  9. LeetCode——四数之和
  10. 经典算法题-----猴子吃桃的问题