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();  
  • 相关阅读:
    微擎开发笔记
    Array对象的方法实现(1)----Array.prototype.push和Array.prototype.concat(实现常规参数的功能)
    ThinkCMF 5 基础门户CMS框架的模板widget标签实现
    [转]mysql为什么默认有那么多root用户,还有用户名为空的用户?
    PHP 5.4特性 trait
    道破人性
    c#使用easyhook库进行API钩取
    黑马eesy_15 Vue:04.综合案例(前端Vue实现)
    黑马eesy_15 Vue:04.Vue案例(ssm环境搭建)
    黑马eesy_15 Vue:03.生命周期与ajax异步请求
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091954.html
Copyright © 2011-2022 走看看