版本: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掉了,那更新版本的时候我就瞎了