【描述】csb的回调特性,如果csbA里有嵌套csbB,则在加载子csb时会由于_rootNode被清空,导致后面的按钮加载没有了回调特性。
【解】利用递归特点,将回调对象(_rootNode)通过参数传递给子节点们。这样子节点加载时使用的是csbB的回调对象。而csbB的递归方法返回后,回调对象还是之前的csbA的。可以继续去加载csbA的子节点们。
这样一来,
每个csb的节点的回调特性,是由各自csb来控制。
这样的话,有个注意事项:一个CSB如果更新了的话,也要将所有用到了该csb的工程里,手动更新。
主要是看到代码里有这么一句
// std::vector<Node*> _loadingNodeParentHierarchy;
不知道是不是特意这么处理的。
以下是我改动的代码,主csb的回调特性的可以正确加载了。其他的没测。
【CSLoader.h】
//nodeWithFlatBuffersFile 里面用到了nodeWithFlatBuffers,参数直接传nullptr即可。
cocos2d::Node* nodeWithFlatBuffers(const flatbuffers::NodeTree* nodetree, Node* CBHandler);
【CSLoader.cpp】
相应用到 nodeWithFlatBuffers的地方全部传递参数CBHandler。
以及
if (CBHandler == nullptr)
{
CBHandler = node;
}
// if (_rootNode == nullptr)
// {
// _rootNode = node;
// }
编译通过。