actiontimeline动画重用

版本:3.8.1 c++
actiontimeline动画,removeChild后,无法再播放

步骤描述&伪代码:
---------------------------------方式1----------------------------------
1.新建10个怪物
monster = CSLoader::createNode(“monter.csb”)
monster.retain()
tl = CSLoader::createTimeline(“monter.csb”)
monster.runAction(tl)
for 10次 pool.add(monster);

2.取出怪物用
addChild(pool.at(0))
tl.play(“attack”,true)

3.怪物死亡后
removeChild(pool.at(0))

4.重复使用这只怪
addChild(pool.at(0))
tl.play(“attack”,true)

问题:此时动画并不会播放
---------------------------------方式2----------------------------------
1.新建10个怪物
monster = CSLoader::createNode(“monter.csb”)
monster.retain()
for 10次 pool.add(monster);

2.取出怪物用
addChild(pool.at(0))
tl = CSLoader::createTimeline(“monter.csb”)//将动画放在每次取出monster后创建
monster.runAction(tl)
tl.play(“attack”,true)

3.怪物死亡后
removeChild(pool.at(0))

4.重复使用这只怪
addChild(pool.at(0))
tl = CSLoader::createTimeline(“monter.csb”)//将动画放在每次取出monster后创建
monster.runAction(tl)//此时报错
tl.play(“attack”,true)

此时直接报错:
12-18 10:58:17.036: I/DEBUG(2572): #00 pc 003686e6 /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (cocostudio::ComExtensionData::getActionTag() const+3)
12-18 10:58:17.036: I/DEBUG(2572): #01 pc 00364a2d /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so
12-18 10:58:17.036: I/DEBUG(2572): #02 pc 00363d13 /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (cocostudio::timeline::foreachNodeDescendant(cocos2d::Node*, std::function<void (cocos2d::Node*)>)+38)
12-18 10:58:17.036: I/DEBUG(2572): #03 pc 00363dc7 /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (cocostudio::timeline::ActionTimeline::startWithTarget(cocos2d::Node*)+70)
12-18 10:58:17.036: I/DEBUG(2572): #04 pc 0043f2a9 /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (cocos2d::ActionManager::addAction(cocos2d::Action*, cocos2d::Node*, bool)+572)
12-18 10:58:17.036: I/DEBUG(2572): #05 pc 003d88f7 /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (cocos2d::Node::runAction(cocos2d::Action*)+24)
12-18 10:58:17.036: I/DEBUG(2572): #06 pc 003230ff /data/app/xxx.xxx-2/lib/arm/libcocos2dcpp.so (MyMainMenu::update(float)+146)

ps:
1.removeChild(node, false)可以解决上述问题,但是我的代码中,其他地方必须要用到removeChild(node, true),我需要其他方式来解决(replaceScene相关,必定会执行removeChild(node, true))

2.我想知道,removeChild中cleanup = true的时候,到底哪些东西cleanup了,哪些没cleanup
这点非常迷,scheduleUpdate、action等cleanup了,ui::Button的按键绑定却没有cleanup
我知道看原代码能找到相关的东西,不过没有官方的说明的话,哪天官方心情一好,把ui::Button的按键绑定cleanup掉了,那更新版本的时候我就瞎了

没人鸟的吗?
@偶尔e网事

void ComExtensionData::onExit()
{
//onRemove();
}

注释掉onRemove()就可以重用了,目前没发现什么问题

3q~
我去试试,不知道会不会导致内存泄露什么的

ComExtensionData::~ComExtensionData()
{
    CC_SAFE_RELEASE(_timelineData);
}

看了一圈代码,ComExtensionData的析构里是有_timelineData的release
按道理应该不会造成泄露
先这么用着吧

谢谢2楼的指导,好人一身平安~

最后,希望官方出个正统的解决方案

我给一种不用改引擎的方案(with lua):
从上面打印的堆栈可以看出是因为timelinedata为空造成的,所以我的方法是重建timelinedata
function initActionTimelineData(parent)
local comExtData = parent:getComponent(“ComExtensionData”)
if comExtData then
comExtData:init()
end

    local children = parent:getChildren()
    for _, child in pairs(children) do
     self:initActionTimelineData(child)
   end

end
在创建的时候让timeline动画引用计数+1
local tlAct = cc.CSLoader:createTimeline(“xxx.csb”)
tlAct:retain()
然后在重用的时候
addChild(node)
initActionTimelineData(node)
node:runAction(tlAct)

目前暂时没发现什么问题,欢迎吐槽!

这思路,看上去可行的样子~
有空试试