cocos2d-x工程中导入cocoStudio编辑器资源的简单示例

    先说明一下,本人其实也是一个cocos2d-x的新手。刚开始接触cocoStudio编辑器的时候,做好了导出资源。然后,在代码中导入这些资源时,碰到过一些问题。虽然有查阅帮助文档,但也不是很顺利。以下是本人关于如何在代码中导入资源文件的一些简单总结:


一、代码中导入cocoStudio UI编辑器所导出的资源:

cocoStudio的UI编辑器做好UI控件后,导出的UI控件资源,如果要在
cocos2d-x的代码中导入,可用如下示例代码:

在场景类中,使用命名空间:

USING_NS_CC;

using namespace ui;

定义一个成员变量TouchGroup * m_pUILayer;

init()方法中,初始化它:m_pUILayer = TouchGroup::create();

然后,将UI编辑器导出的文件夹置于Resource文件夹下。如果是Android平台,要置于assert文件夹下。


Layout* map_root = static_cast <Layout *>(GUIReader ::shareReader()
    ->widgetFromJsonFile("MyFolder/example.json"));
m_pUILayer->addWidget(map_root);

上述两行代码,将UI编辑器产生的json文件导入,并添加到m_pUILayer中。

或者可以自己创建一个Layer继承自TouchGroup,然后加载到该layer中。



接下来,要获取UI界面中的某个具体控件,有如下三种方法:

1、使用UIHelper类的静态方法seekWidgetByName(Widget *rootWidget, const char *);
    注意该方法的首参数为UI根节点,第二个参数为UI控件的名称,该控件的名称是我们在使用UI编辑器时,给该控件所起的名称。如下:
    Layout* button_layout = static_cast< Layout*>
        ( UIHelper::seekWidgetByName(map_root, "button_Panel" ));
        
2、使用TouchGroup指针对象的getWidgetByName(const char *)方法。
    因为最前面两行代码已经将UI界面的根结点加载到m_pUILayer中,因此可以
    调用m_pUILayer方法的getWidgetByName()方法来获取某个控件。如下:
    Button* back_button = static_cast <Button *>(m_pUILayer->getWidgetByName("back_Button"));
    
3、先获取父控件,再调用父控件的getChildByTag(int tag)方法或getChildByName(const char *)方法。


最后,应当注意的是,要手动释放加载资源时用到的单例对象。

//退出时清理资源
void CocosGUIExamplesMapScene ::onExit()
{
    m_pUILayer->removeFromParent();
    SceneReader::sharedSceneReader()->purge();
    GUIReader::shareReader()->purge();
    cocos2d::extension:: ActionManager ::shareManager()->purge();
    CCScene::onExit();
}


二、代码中导入cocoStudio 场景编辑器所导出的资源:

cocoStudio的场景编辑器做好场景后,导出的场景资源,如果要在
cocos2d-x的代码中导入,可用如下示例代码:

//获取场景的根Node
CCNode *pRootNode = SceneReader::sharedSceneReader()->createNodeWithSceneFile("NewScene.json");
//将根Node加载到Layer中
addChild(pRootNode);

同样,json文件要置于Resource目录下


应当注意的是,cocoStudio的场景编辑器中,一个Node可以下挂一个Component。
如果要对某个特定的Node或Sprite操作的话,要先获取该Node或Sprite。

获取某个Node的方法:
1、该Node如果是根Node的直接子节点,则
    调用根Node的getChildByTag(int tag)或getChildByName(const char *)
    
2、该Node如果不是根Node的直接子节点,则先用上述方法获取该Node所属的最高级节点。
    不断循环调用,直至获取到该Node
    
    
获取某个Sprite的方法:
首先应当注意,Sprite必定是挂载于某个Node下方,作为一个Node的Component。
故而先获取得Node,假设已经获取得该Node为pNode。
//获取Node下的Component
CCComRender *pCom = static_cast<CCComRender *>(pNode->getComponent("myComponent"));
//获取精灵
CCSprite *pSprite = static_cast<CCSprite *>(pCom->getNode());


获取骨骼动画或者其他的组件也是类似的方法,先得到Component,再调用Component的getNode()方法。

最后,注意在onExit()函数中,不要忘记了释放单例对象。

SceneReader->sharedSceneReader()->purge();


三、代码中导入cocoStudio 动画编辑器所导出的资源:

cocoStudio动画编辑器做好动画后,导出的动画资源,如果要在
cocos2d-x的代码中导入,可用如下示例代码:

//动画资源管理器。动画编辑器导出的文件置于Resource/anim/explode/ 文件夹下

CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("anim/explode/ExplodeAnimation0.png",
        "anim/explode/ExplodeAnimation0.plist", "anim/explode/ExplodeAnimation.ExportJson");

//创建动画精灵,参数为cocoStudio动画编辑器创建的动画项目的名称
CCArmature *armature = CCArmature::create("ExplodeAnimation");
CCArmatureAnimation *pAnimation = armature->getAnimation();

//设置动画完成后的函数调用,一般在这里移除动画精灵
pAnimation->setMovementEventCallFunc(this, movementEvent_selector(HelloLayer::explodeDone));
//播放动画
pAnimation->playWithIndex(0);
//设置动画精灵的位置
armature->setPosition(point);
//添加动画精灵
addChild(armature);


PS:应当注意的是,cocoStudio动画编辑器的资源加载后,不会自动释放,要手动释放。
    因此,一般在CCLayer或CCScen的onExit()函数中,要释放动画资源管理器。
    即:CCArmatureDataManager::sharedArmatureDataManager()->purge();


cocoStudio的数据编辑器还没碰过,有时间再总结一下。

你可能感兴趣的:(编辑器,cocos2d-x,cocostudio)