使用中发现:将对象返回对象池时,如果该对象上有计时器或动作(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 仍然存在,,,