日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x : csb的加载

發(fā)布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d-x : csb的加载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
cocos2d-x : csb的加載
  • csb的加載時通過 CSLoader 類加載的
    先看 CSLoader.h 簡單介紹幾個函數(shù)
  • class CC_STUDIO_DLL CSLoader { public:// 通過csb文件名 創(chuàng)建節(jié)點 例如:cocos2d::CSLoader::createNode("aaa.csb");static cocos2d::Node* createNode(const std::string& filename);// 通過文件名 創(chuàng)建時間線 序列幀 例如:cocos2d::CSLoader::createTimeline("aaa.csb");static cocostudio::timeline::ActionTimeline* createTimeline(const std::string& filename);// 通過json文件名 創(chuàng)建節(jié)點 例如:cocos2d::CSLoader::createNode("aaa.csb");cocos2d::Node* createNodeFromJson(const std::string& filename);// 從文件中 獲取到數(shù)據(jù) buffer 初始化textures要用到的testure都放入SpriteFrameCache里// 獲得NodeTreecocos2d::Node* createNodeWithFlatBuffersFile(const std::string& filename);// 將nodeTree里的節(jié)點遞歸調(diào)用此方法渲染出來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);// 獲得渲染節(jié)點的類名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里的內(nèi)容保存到data中 里面使用的是文件操作打開文件、讀取文件、關(guān)閉文件Data buf = FileUtils::getInstance()->getDataFromFile(fullPath);auto csparsebinary = GetCSParseBinary(buf.getBytes());1auto 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);2return node; }

    【1】解析: GetCSParseBinary(buf.getBytes()) 此方法是在CSParseBinary_generated.h文件里的

    inline const flatbuffers::CSParseBinary *GetCSParseBinary(const void *buf) {return flatbuffers::GetRoot<flatbuffers::CSParseBinary>(buf); } // 此方法會返回一個結(jié)構(gòu)體 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】解析:遞歸調(diào)用nodeWithFlatBuffers(csparsebinary->nodeTree(), callback);把所有的節(jié)點渲染出來
    渲染類

    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// 從這些渲染類中生成對應(yīng)的對象 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);//遞歸把所有的子節(jié)點全部渲染出來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);}

    總結(jié)

    以上是生活随笔為你收集整理的cocos2d-x : csb的加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。