先说明一下,本人其实也是一个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的数据编辑器还没碰过,有时间再总结一下。