问题如下步骤:
1.我在ccstudio中创建了一个 节点,名字是:General.csb
这个文件中有个子节点 animate 是个sprite动画
2.我在代码中对应创建了:General.h和.cpp还有对应的Reader类
3.我在其他一个场景中做了如下操作(以下代码分步骤 用 ①、②、③表示):
①//创General实例
general = (General*)CSLoader::createNode(“General.csb”);
②//获到general子项 animate(就是那个 sprite动画)
Sprite animate = (Sprite)general->getChildByName(“animate”);
③//设置坐标
general->setPosition(ccp(480, 320));
加入场景
scene->addChild(general);
问题出现了:
Sprite animate = (Sprite)general->getChildByName(“animate”);
animate 是NULL
------------------------------------------------------------------这里割一下,下边是我自己的一个理解,不知道对不对-------------------------
顺便想请教一个新手问题,关于 CSLoader::createNode(“xxx.csb”);
我看过源码,在创建XXXReader后,直接CSLoader::createNode…会根据类名查找所创建Reader类,然后框架内部创建对应csb的类实例,并结合图形UI和类实例。
但是这里我有个不明白的地方,希望能帮忙解下疑惑。
CSLoader.cpp 这个类 770行 Node* CSLoader::nodeWithFlatBuffers(const flatbuffers::NodeTree *nodetree);
方法体中 :774行 std::string classname = nodetree->classname()->c_str();
获取到类名称,然后假设我这里创建的是一个自定义或者视图类型,直到810行开始解析,判断如果创建该类名对应的XXXReader则成立,否则这个方法再往下基本就不用走了,
但是如果是单一的一层还好说,我感觉我上边的问题就出在这里,因为我创建了General体系的头文件+类,包括General的Reader头文件+类,所以我上边提问的标红处的代码,
第①步可以获取到实例,但是第②步,我在获取其中animate属性的时候就是NULL。
接着刚才聊到的,810行,我跟踪代码,创建完成General后,继续向下,执行到添加General.csb的属性,上边提到过,我在里边加入了一个Sprite,并且放入了5帧动画,但是当
现在代码执行到843行的时候,走的创建体系和root是一套,也就是说,框架解析csb文件没问题,但是解析他的子项的时候如果再次执行到810行,而里边这个动画没有Reader,就会无法创建,
所以我上边提到的animate(我在General下的子节点)是NULL。
我大概看的是这个原因,因为以前玩cocos2d的时候也有类似的功能,就是UI编辑器直接做类视图,然后通过在编辑器中指定类名,在代码启动实例化的时候做视图+实例类结合,
我是个新手,感觉万整体的代码这里应该是创建后,里边的子节点即使不包含Reader也应该是存在的,如果是自己理解错了,希望版主能帮忙纠正一下,谢谢……