spine的setEndListener有效么

我昨天测试的就是1.61正式版呢

那就要问问 @nantas

多么期望每次等待很多天已完成的修复,可以确定无误的合并到相邻的最近一个新版本啊。
等待很多天,重新安装新版本,如果cocos-lite更新了,还需要删除已有的,重新构建编译,重新导入配置相关sdk,然后还是没有。

现在没效果的表现是什么?有报错吗?如果是我的修复没有生效的话,应该是会报错的,arguments parsing issue 或者 arguments 的其他错误信息。

感觉你那个 log [track …] 应该是有打印出来的吧?好像跟我修复的问题没什么关系的样子

去掉 scheduleOnce 直接切换场景呢

没有报错信息,这段代码的上下文代码都执行了。没有看到end的log打印。
另外:为什么xcode控制台打印的是Cocos2d-x-lite v1.6.0,但是构建编译时提示需要删除旧的,目前lite版本其实已经是1.6.1,已经删除beta2的,重新构建的干净的目录了,虽说这个不影响,但是很疑惑。

版本号貌似没改,这个是不影响。

没有看到 end 的 log 就很奇怪了,我们的测试例一直都有 EndListener 的测试,都可以正常回调。

你检查一下打包出来的目录下的 project.dev.js,找到 setEndListener 那行,看看代码有没有被正确编译成 ES5 函数的形式

spine.setEndListener(function (track) {...

project.dev.js中的代码段是这样的。

adShowTimeoutCallback: function adShowTimeoutCallback() {
                var self = this;
                var skeleton = this.node.getChildByName("skeleton");
                skeleton.active = true;
                this.adNode.active = false;
                this.radialNode.active = false;
                var spine = this.spine = skeleton.getComponent("sp.Skeleton");
                spine.setEndListener(function(track) {
                    console.log("[track %s] end", track);
                    self.scheduleOnce(function() {
                        cc.audioEngine.stopAll();
                        cc.director.loadScene(self.next);
                    }, 1);
                });
                this.node.on(cc.Node.EventType.TOUCH_START, function(event) {
                    self.clickStart();
                }, this.node);
            },

看上去没问题,可以在 setEndListener 之前检查一下 spine._sgNode 是否存在

受到panda兄的启发我找到原因了,但是不知道怎么解决。
我试了官方的spineboy例子,可以执行endlistener中的函数,证明引擎在一定条件下可以正常运行这个功能。
我的项目中的skeleton开始在面板那勾选了active为false,这种情况怎么都不会运行结束回调函数,即使在代码中已经又设置为了active为true。
结束回调可以运行必须满足两个条件:
(1)在面板那必须勾选active为true
(2)增加这个代码spine.setAnimation(0, ‘walk’, false,0);
具体位置为:

 var skeleton=this.node.getChildByName('skeleton');
        skeleton.active=true;
        this.adNode.active=false;
        this.radialNode.active=false;
        var spine = this.spine = skeleton.getComponent('sp.Skeleton');
        spine.setAnimation(0, 'walk', false,0);//新增代码
        spine.setEndListener(track => {
            console.log("[track %s] end-----------", track);
            self.scheduleOnce(function(){
               //cc.audioEngine.end();
               cc.audioEngine.stopAll();
               cc.director.loadScene(self.next);
            },2);
        });

我确定之前可以运行的引擎版本是不用添加新增代码的。

在setEndListener之前这个节点是存在的,可以打印出对象

谢谢反馈,确实会收到 active 的影响,我们会在今后进行修正。

嗯即使active在面板那设置为true,animation那不能为none,也需要增加那行代码。
我会想办法绕过去,不纠结这啦。
谢谢panda兄和jare兄的帮助,提供了很多启发性的思路。

1.6.2beta2中setEndListener还是会受到active的影响,请问这个会在哪个版本中可以支持在面板中设置acitve为false,然后在脚本中动态设置为true,同时不影响setEndListener的执行呢?

@bluehumor spine-runtime在3.5版本之后重新定义了EndListener的触发条件,和3.5之前的版本不一样了。
3.5+的版本End回调只有当一个Track上的CurrentEntry不再是CurrentEntry时才会产生。一个Entry运行完毕时仍然是对应Track的CurrentEntry,所以只会调用Complete回调。除非被下一个Entry替换,或者是调用ClearTrack之类的方法。所以如果是不能触发End回调的话可以先检查一下是不是因为这个原因

这个之前已经确认了是因为active的问题导致的失效

1.8.1版本中 EndListener还是不触发啊?

同样遇到不生效了

看来官方的精力都在微信小游戏和qq玩吧了:joy:,bug没人修复了。。。

1.8.1同遇到EndListener不触发, 必须多设置一个动画才行。。另要怎么移除spine的listener@panda?

同问,如何移除spine的listener?播放一个动画时设置了eventListener, 当切换动画后不再需要了,可怎么移除呢?如果设置为null则报错提示listener is not a function? @panda