level 7
策划狮
楼主
先说明一下,本人其实也是一个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的数据编辑器还没碰过,有时间再总结一下。
2014年09月03日 03点09分
1
一、代码中导入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的数据编辑器还没碰过,有时间再总结一下。