creater 将对象返回对象池时,取消计时器和action的问题

使用中发现:将对象返回对象池时,如果该对象上有计时器或动作(action)正在执行,那么计时器会继续执行,而动作会在下一次从对象池申请出后继续执行(如:cc.moveBy())。
计时器用this.unscheduleAllCallbacks();可以取消。但是action没有找到可用的取消方法,使用了this.node.stopAllActions();并不能完全取消action。
请问有什么接口 可以把action取消掉,使节点还原为初始状态。

node.stopAllActions 怎么不能完全取消?不科学啊……

我说的不能完全取消action,确实表达的奇怪了。具体是这样的:已知对象池有30个这样的节点,每0.2秒1次,get()以后runAction()向右一直移动。当没有node.stopAllActions()时,这些返回的节点会在下次get()的时候得到。现象就是,一旦有节点返回了对象池,马上就会出现跑得飞快的节点。
而当有node.stopAllActions()时,那些跑得飞快的节点不会马上出现,而是等对象池里的剩下的节点全都被get()一遍以后才出现。
当然也可能是我代码错了。
代码是这样的:
主控制程序global在Canvas节点。对象池节点soldier。
在global.js中:

this.scheduleOnce(function(){
            this.schedule(function(){
                var soldier1 = this.getSoldiersFromPool(……)//向对象池申请并设置属性数值
                soldier1.runAction(cc.moveBy(3,900,0));//向右移动
                this.scheduleOnce(function(){
                    this.soldierPool01.put(soldier1);//若没有发生碰撞,3秒后返回对象池
                },3);
            },0.2,9,0.2);
 },2);

在soldier.js中:

onCollisionEnter: function (other, self) {//碰撞回调
        //console.log('on collision enter');
        if (this.def === 0){
            this.unscheduleAllCallbacks();//停计时器
            this.node.stopAllActions();//停动作
            this.gameGlobal.getComponent('global').soldierPool01.put(this.node);//碰撞后立即返回对象池
        }else if (other.node.name === 'fireball2'){
            this.def -= 1;
        }
}
1赞

补充一下,如果所有节点都没有发生碰撞,全部都是3秒动作结束后才返回,那么久不会出现跑得飞快的节点。

检查发现 stopAllActions 的确是有问题,我们会在下一个版本修复

1赞

没暂时的解决方案?

谢谢。那我先直接new新节点来替代吧。

可以尝试先用

cc.director.getActionManager().removeAllActionsFromTarget(this.node, true);

来替代 this.node.stopAllActions()

我又尝试了一下,发现无法重现你的问题,虽然代码里面的隐患解决了,但是我无法确认是否能修复你的问题,如果有 demo 麻烦提供一下。

隐患是在 action 运行过程中(只有可能在 callFunc 回调中)调用 stopAllActions 才有可能导致问题

这个问题,在 2.4.2 仍然存在,,,