【教程】如何在2d-x中加载CocosStudio2.0版本生成的数据

使用Studio2.0发布的CSB资源更换了加载方式,需要用CSLoader来加载。CSLoader在Cocos2d-x3.3RC0开始提供。
以下提供的是C++的代码,lua、js的接口是一样的。只有一点区别:
CSLoader在lua中对应cc.CSLoader
在js中对应ccs.csLoader (在2d-js3.1RC0中需要做点http://www.cocoachina.com/bbs/read.php?tid-272678.html)

#include “ui/CocosGUI.h”//UI相关的头文件
#include"cocostudio/CocoStudio.h"//在CocosStudio.h 头文件中已经包含了Studio所需要的各个头文件(除CocosGUI)因此我们使用Studio仅需要包含他就可以
using namespace cocos2d;//CSLoader位于cocos2d命名空间。
using namespace cocostudio::timeline;//动画相关的类位于cocostuio::timeline当中

void myScene::initFunc()
{
//以下是加载相关的代码:
Node *rootNode = CSLoader::createNode(“MainScene.csb”);//传入Studio2.x的资源路径
this->addChild(rootNode);//假设this是即将显示的scene

//加载动画:
ActionTimeline *action = CSLoader::createTimeline("MainScene.csb");
rootNode->runAction(action);
//注!!!:同一个文件创建的节点只能使用同一个文件创建的动画。

//嵌套节点的动画会自动加载动画,可以用嵌套节点->getActionByTag(嵌套节点->getTag()) 来获取动画

//播放动画:
action->gotoFrameAndPlay(0,60,true);//从第0帧到60帧循环播放。还有其他重载函数,具体看源码。


//帧事件监听
action->setFrameEventCallFunc(CC_CALLBACK_1(myScene::onFrameEvent, this));
//关于CC_CALLBACK_1需要点C++11的基础才能知道是咋回事,这里只要照着写就行。想了解可以查下std::Bind

//帧事件是可以检测到最后一帧的事件的,已测3.6

//动画结束侦听
action->setLastFrameCallFunc(CC_CALLBACK_0(myScene::AnimationEnd, this));
//可以帧听到,亲测3.6。
}
void myScene::onFrameEvent(Frame* frame)//固定的格式
{
EventFrame* evnt = dynamic_cast<EventFrame*>(frame);
if(!evnt)
return;

std::string str = evnt->getEvent();
if (str == "xxoo")
{
    CCLOG("come on baby");
}

}

void XXX::AnimationEnd()
{
CCLOG(“animation end”);
}

注:

  1. 不会看源码的码农不是好程序猿啊。经常有人求某个API接口,这东西查查头文件看接口名就能知道个大概啦。源码就是最权威的API文档啊有木有!!!
  2. 2.x版本Studio导出的CSB资源需要与2d-x严格对应(具体看http://www.cocoachina.com/bbs/read.php?tid-182077.html)(估计以后会提供与2d-x解耦的方法。)
  3. CocosStudio v2.x 假定在编辑器里边的资源目录即游戏的最终的目录结构,因而如果你修改了导出资源的目录则需要编辑器目录也需要跟着修改。也可以用addSearchPath来把你的路径添加到FileUtils中,但要小心文件名冲突。

PS:我已经在3.6亲自测试过了,如果还是侦听不到帧事件,请先测试下面的资源文件和代码,谢谢。

cocos2dx3.3rc2的cocos stuido目录下。有个reader文件夹。里面有个GUIReader 和SceneReader。
顾名思义。结果出错了。找到这里才发现要用 TimelineAction文件夹里面的csload去加载。
有谁会想到reader里面的sceneReader不是用来加载.csb的呢.

马克马克马克马克马克马克马克

不得不说,不是None,而是Node 误导我很长时间。 望改正!

已更正、多谢支持

为什么我的加载不出来 3.3final的 child是空

从studio导出的csb中,"层级"类别该如何读取成Widget类?

层级是啥= =

2.06版的studio导出的是.csd后缀的文件

说错。。是图层。。。。问题已经解决 感谢

另外再一个问题,我只找到把csb创建成Node的方法createNode,我想要的是导出Scene该如何处理?

有没有比较详细的发布到vs2012的步骤啊。。。

我也想知道这个问题, 一直不明白cocostudio里新建的scene跟cocos2d里的scene是不是一回事,被搞晕了

不是,一个美术概念,一个程序概念。

我按照楼主的代码操作发现不能监听帧事件

赞的!希望这种说明,在版本或者Manual中能明确说明,否则用起来真的无从下手。。

SceneReader好像老版的j son可以用
顺便问一下,现在版本的j son文件可以用在C++里吗,有相关的解读类吗

小白求帮助
我的是cocos2dx 3.3版本,cocostudio是2.02,Init()函数中就有Node *rootNode = CSLoader::createNode(“MainScene.csb”);
this->addChild(rootNode);,csb文件也确实放入res文件中了,VS没有报错,但每次运行都会这么显示

看提示,是csb文件或者是资源文件没有查找到。

cocosstudio 发布之后,需要把 res 里面的所有东西,copy到 cocos2d-x resources 下面去。

想问怎么获取2.0的控件啊,不能像1.6那样用seekwidgetbyname