spine的setEndListener有效么

spine.setEndListener(track => {
cc.log("[track %s] end", track);
self.scheduleOnce(function(){
//cc.audioEngine.end();
cc.audioEngine.stopAll();
cc.director.loadScene(self.next);
},1);
});
1.6rc1,上面的监听以前是好使的,现在没有效果

1赞

panda已修复

https://github.com/cocos-creator/cocos2d-x-lite/pull/7636

1.61版本还是无效,这个功能什么时候可以恢复呢?
@panda @jare

这个问题确实已经修复了,你可以检查一下你打包出来的工程相应的文件里面是否有下面的修改

https://github.com/cocos-creator/cocos2d-x-lite/pull/763

如果没有的话要等下个版本,如果有,还没有修复,麻烦把没效果的具体报错或者表现发出来,只是说没效果我们不清楚具体是什么样的表现,也无从下手

bool c_string_to_jsval(JSContext* cx, const char* v, JS::MutableHandleValue ret, size_t length)
{
if (v != nullptr && length == -1)
{
length = strlen(v);
}

if (0 == length || v == nullptr)
{
    auto emptyStr = JS_NewStringCopyZ(cx, "");
    ret.set(JS::StringValue(emptyStr));
    return true;
}

我用的binary模式,我看了应用程序里的代码是这个,那就是最新代码了。
我的应用里,之前是spine的一个动作结束后,执行这个回调,然后跳转到下一个场景,现在没有达到这个效果。

你先试试看 default / link 模版,binary 我不确定 1.6.1 是否重新编译了

好的,我明白了。多谢:)

刚才测试了1.61正式版本,这个问题还存在,请问这个修复合并到1.61正式版了么?
binary方式。

123

我的项目使用的是binary方式,只是想确认这个修复是否合并到binary方式啦?之前看过beta 版指定的源码文件,是更新过的

beta 版一般不会更新 binary,正式版会合并的

我昨天测试的就是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);
        });

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