我不得不又上来吐槽了,触发器尼玛就是一个坑!!!
单个的还行,如果要加载多个从场景编辑器中导出的json文件创建node到同一个层中就只有最后一个读取的触发器有效了,其他的都获取不到对应的节点,跟踪代码发现根源在这里
SceneReader::getInstance()->createNodeWithSceneFile方法
cocos2d-x 3.4 CCSSceneReader.cpp第67-78行:
if (file_extension == “.JSON”)
{
_node = nullptr;
rapidjson::Document jsonDict;
do {
CC_BREAK_IF(!readJson(fileName, jsonDict));
_node = createObject(jsonDict, nullptr, attachComponent);
TriggerMng::getInstance()->parse(jsonDict);
} while (0);
return _node;
}
每次通过SceneReader::getInstance()->createNodeWithSceneFile方法创建的节点都会将单例SceneReader中的私有属性_node覆盖,而返回的节点也正是这个属性值。
然而触发器的实现完全依赖于节点的Tag值,怎么找到对应的节点呢?
在acts.cpp中看到还是用的单例SceneReader,通过SceneReader::getInstance()->getNodeByTag(_tag)来找到要执行动作的各个节点
CCSSceneReader.cpp第468-479行:
Node* SceneReader::getNodeByTag(int nTag)
{
if (_node == nullptr)
{
return nullptr;
}
if (_node->getTag() == nTag)
{
return _node;
}
return nodeByTag(_node, nTag);
}
尼玛这是在_node中寻找啊,这个_node只是最后一次使用createNodeWithSceneFile时那个json文件中的节点而已,之前的你甭想找到
这就决定了同一层中使用多个场景编辑器导出的json时只有最后一个含有的触发器有效。

另外就是触发器的扩展,扩展之后要想在Cocostudio中正常播放预览你得自己重新编译一个Cocostudio模拟器才行,尼玛到处找不到重编Cocostudio模拟器的资料。
我已经深受内伤