停止动作执行后,还会执行回调函数

ndoe.stopAllActions执行后,动作的callFunc仍然会被执行一次。
这是 demotest.zip (750.9 KB)

收到,目前测试中,有进展了的会跟您说,谢谢反馈

这个是正常行为,机制问题,因为 cc.callFunc(function () { cc.log(‘1’); } 是立即执行的,而 node.stopAllActions(); 会在下一帧才暂停如果你修改为以下代码就不会出现那样的问题了:

var action = cc.sequence(
        cc.delayTime(0), 
        cc.callFunc(function () {
            cc.log('1');
        }), cc.moveBy(1, 50, 50), cc.callFunc(function () {
            if (b) {
                node.stopAllActions();
                cc.log('stopAllActions');
            }
        })).repeatForever();

所以这是个 bug 呢,还是预期行为?
另外,解决问题的关键是添加一个cc.delayTime(0)

不是 bug 是预期行为,嗯

这是不能理解的预期行为。
我的动作是顺序执行的,那么在停止动作后它就不应该再执行。上面提到的 stopAllActions会在下一帧才暂停一事,是不合适的理由,由于使用动作系统不会关心关于帧的东西。
如果你认为我的认知和大多数人的认知不同,也就是说stopAllActions应该会让这个动作的第一个callFunc继续执行一次,或者还要视它有什么样的其他动作函数前置的情况而定,那我就没话可说。
否则呢,即使不能修复这个问题,至少在文档里加上关于此的说明。

当然了,我还是会认为这是 bug,即使你认为这是合适的。

好吧,可能我解释的不够清楚,等 @panda 大神给你解释一下吧…

正如你所说,动作系统不关心帧,所以重复的顺序动作的首尾是直接连接在一起的。

这里我们遇到的问题是:由于你在动作自己的回调里面停止自身,这个我们是不能够立即删除 action 的,会引发一系列遍历问题,导致更严重的 bug。所以才会出现你遇到的动作没有立即停止,而是连带下一个 actionInstant 一起执行了才停止。

所以根源在于,你不应该在 callFunc 回调中停止自己。@Knox 麻烦在 callFunc 文档中注明这点

多谢。
我这样做是因为我必须完整的停止一个动作序列,所以我在接收到外部信号以后,在动作尾部的callFunc停止这个动作。现在我改成在这个动作序列的首部的callFunc中停止这个动作,达到了目的。
那么,是否有别的方式让我完整的停止一个动作序列呢?