【已解决】Armature对象播放完动画,用什么方式remove掉?

本人用的是cocos2d-x 3.0版本。在Armature对象播放完动画时,有时候会有残影留下(反复播放动画的话残影会很明显)。一方面为了消除残影,另一方面为了释放资源,在动画播放完时应当remove掉armature对象。我的思路是当动画播放完成,回调MovementEventCallback,这个时候调用armature对象的removeFromParent(之前控件runAction也是用类似的方式,在runAction最后的回调中调用removeFromParent,是ok的),却会发生崩溃,崩在了armature的update方法里面。我想可能是Armature的生命周期我没有搞清楚,可是我查了一些资料也没找到其他的解决方案。不知道哪位大神有高见。代码如下:

    void playAnimation(Node* node) 
        {
            float speed = 2.0f;
            Armature *armature = Armature::create("anim");
            armature->getAnimation()->setSpeedScale(speed);
            armature->getAnimation()->playWithIndex(0, -1, 0);
            node->addChild(armature);
            armature->setPosition(Point(0, 0));
            std::function armatureFun = =](Armature* armature, MovementEventType type, const std::string& id)
            {
                if (type == MovementEventType::COMPLETE)
                {
                    armature->getAnimation()->stop();  //这句有没有都会崩
                    armature->removeFromParent();     //调用这句导致崩溃
                }
            };
            armature->getAnimation()->setMovementEventCallFunc(armatureFun);
        }


```

沙发自己的

这问题我关注好久了,从3.0版本开始到3.2 一直没说法。
我也是没法移除这个对象的实例。
尝试过很多种方法,都会导致程序异常崩溃…

楼上的朋友也碰到这样的问题了啊,还真是挺头疼的。那现在你们项目中有用什么折中的方案吗?总不能一直add吧

官方,给说法!

我现在就不消除…等他们更新再说。

好吧。。看来你添加的不频繁

这个问题真的没解决方案吗?开发者看过来~

void playAnimation(Node* node)
{
float speed = 2.0f;
Armature armature = Armature::create(“anim”);
armature->getAnimation()->setSpeedScale(speed);
armature->getAnimation()->playWithIndex(0, -1, 0);
node->addChild(armature);
armature->setPosition(Point(0, 0));
std::function<void(Armature
, MovementEventType, const std::string&)> armatureFun = =](Armature* armature, MovementEventType type, const std::string& id)
{
if (type == MovementEventType::COMPLETE)
{
armature->getAnimation()->stop(); //这句有没有都会崩
armature->runAction(Sequence::create(DelayTime::create(.1f),CallFunc::create(CC_CALLBACK_0(Node::removeFromParent,armature)), NULL));
}
};
armature->getAnimation()->setMovementEventCallFunc(armatureFun);
}

加延迟亲测可用,非常感谢!

问题已解决,谢谢大家