zoukankan      html  css  js  c++  java
  • 让cocos2d-x 3.0读取cocostudio中的csb文件

    让cocos2d-x 3.0读取cocostudio中的csb文件

        ​  现在cocostudio的功能越来越完善,还支持导出二进制的csb文件。可惜现在项目使用的还是3.0版本,不支持csb解析,总不至于为了一个解析功能将整个库升级吧,这也太小题大做了。因为这个csb文件只是将明文的*.ExportJson文件变成二进制的,我猜测只是文件解析略有不同,其他使用都无须改变,所以现在我现在的思路是仅替换文件解析的类。


     以一个骨骼动画为例(项目资源和源码在文章下面下载),3.0中加载并播放一个骨骼动画的代码是:

    1. ArmatureDataManager::getInstance()->addArmatureFileInfo("DemoPlayer.ExportJson");  
    2. auto arm = Armature::create("DemoPlayer");  
    3. this->addChild(arm);  
    4. arm->setPosition(Point(300, 300));  
    5. arm->getAnimation()->play("walk");  
    6. // 一般放在onExit或析构中  
    7. ArmatureDataManager::destroyInstance();  

     可以看出,第一行就是加载ExportJson文件,但如果换成"DemoPlayer.csb"打开出错,为什么呢?前面已经说过,3.0不支持了=。=!!


    废话太多了。。。下面是详细步骤:

    1 复制源码:跟进addArmatureFileInfo()可以发现CCS资源的解析是由DataReaderHelper类提供的,因此从3.2的cocos/editor-support/cocostudio目录下复制CCDataReaderHelper和CocoLoader源文件(.h和.cpp)共四个文件到3.0的cocos/editor-support/cocostudio目录下替换掉原来文件。


    2 然后在工程中将CocoLoader.h和CocoLoader.cpp添加到cocostudio目录中:


    3 修改CCDataReaderHelper.cpp中的错误。

           (1) 头文件路径不一样,去除"base/"。如#include "base/CCDirector.h"改为#include "CCDirector.h",把下面两个CCScheduler.h和ccUtils.h路径也改了。

           (2) 将Vec2类名改称Point,共两处,仔细看报错。(3.2中Point类名又被改成Vec2了,可怜的Point又一次被改名了。。。)

           (3) CCDataReaderHelper.cpp还有十几处Use of undeclared identifier 'utils'错误,这是因为3.0扩展了ccUtils.h,增加了几个新功能,修改方法见第4条。


    4 跟进ccUtils.h中,也可以直接在cocos/2d/support目录下找到。

           (1) 在.h中加入以下头文件:

    1.    #include <vector>  
    2.    #include <string>  
    3. <span style="color:#FF0000;"><strong>   </strong></span>#include "2d/CCNode.h"  
    4. <span style="color:#FF0000;"><strong>   </strong></span>#include "ccMacros.h"  

              (2) 在.h的cocos2dx命名空间内加入以下代码:
    1. namespace utils  
    2. {  
    3.     double atof(const char* str);  
    4. }  
              (3) 在.cpp的cocos2dx命名空间内加入以下代码:
    1.             namespace utils  
    2. {  
    3. #define MAX_ITOA_BUFFER_SIZE 256  
    4.       
    5.     double atof(const char* str)  
    6.     {  
    7.         if (str == nullptr)  
    8.         {  
    9.             return 0.0;  
    10.         }  
    11.           
    12.         char buf[MAX_ITOA_BUFFER_SIZE];  
    13.         strncpy(buf, str, MAX_ITOA_BUFFER_SIZE);  
    14.           
    15.         // strip string, only remain 7 numbers after '.'  
    16.         char* dot = strchr(buf, '.');  
    17.         if (dot != nullptr && dot - buf + 8 <  MAX_ITOA_BUFFER_SIZE)  
    18.         {  
    19.             dot[8] = '';  
    20.         }  
    21.           
    22.         return ::atof(buf);  
    23.     }  
    24.       
    25. }  


    5 至此就大功告成了,但是如果仍报CocoLoader与CCDataReaderHelper的链接错误,那么需要手动在"cocos2dx IOS"的"Build Phases"上手动添加CocoLoader的.h和.cpp文件。下面给出添加步骤:

    (1) 选择项目目录下的"cocos2d_libs.xcodeproj",在右边"build all libs iOS"下面的"cocos2dx iOS"库(如果要在Mac上运行,则选择"build all libs Mac"下面的"cocos2dx iOS"库),再选中右边的"Build Phases"。如下图:


            (2) 点开"Compile Headers",再点击"+"号,添加CocoLoader.h进去,此时h文件应该是(356 items)


           (3) 点开"Compile Sources",再点击"+"号,添加CocoLoader.cpp进去,此时cpp文件应该是(301 items)



    现在应该可以编译并运行csb文件了,将DemoPlayer.ExportJson改成DemoPlayer.csb运行了看看吧!
    1. ArmatureDataManager::getInstance()->addArmatureFileInfo("DemoPlayer.csb");  
    2.   
    3. auto arm = Armature::create("DemoPlayer");  
    4. this->addChild(arm);  
    5. arm->setPosition(Point(300, 300));  
    6. arm->getAnimation()->play("walk");  
    7. // 一般放在onExit或析构中  
    8. ArmatureDataManager::destroyInstance();  
  • 相关阅读:
    Photoshop 基础七 位图 矢量图 栅格化
    Photoshop 基础六 图层
    Warfare And Logistics UVALive
    Walk Through the Forest UVA
    Airport Express UVA
    Guess UVALive
    Play on Words UVA
    The Necklace UVA
    Food Delivery ZOJ
    Brackets Sequence POJ
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091954.html
Copyright © 2011-2022 走看看