[][临时解决]bug?加载sk问题

已经导出好的龙骨文件,dragon.sk和dragon.atlas,放入资源文件夹
在ide环境下,将dragon.sk拖入ui场景,正常播放了
与ui配套的脚本启动后要调用dragon.sk上一个动画,
!!!运行时,报错,说_template为null。
如果不调用动画,只是监听事件,没有错误
于是考虑,应该是加载sk完成前,就调用动画导致
因此,在最开始用Laya.loader.Load(["drgon.sk"]......)这样的方式预加载
!!!结果,预加载时报错,就是这里:


laya.core.js的7430行    if (this._pos_+2 > this._length)throw "getUint16 error - Out of bounds";


但是,不使用预加载,就不报错,只是不知道什么时候真的加载完成,那个_template不再为null,我就可以调用play了。
 
怎么解决?
 
我上传了用到从骨骼动画,大家帮忙测测,看有问题没?
 
[2018-06-23 8:51 补充]
发现之前的用Loader加载sk资源并未报错。
但是在:


var game = new Game(); // Game是ui的逻辑类,ui里面拖入了那个龙骨动画
Laya.stage.addChild(game);


运行起来后,就报7430行那个错了。
很怪,如果不预加载,就没错。
 
[2018-06-23 9:43]
开头使用Loader进行预加载时,使用这种形式,就避免了运行时报错。


{url:"ui/Clown.sk", type:Loader.BUFFER},


但,调用play播放指定动画时,还是说_template为null,
除非先等上若干帧再调用,才正常。
问题是,拖到ui设计器里的元素,如何在生成ui时判断这个组件是否已经准备就绪?

[2018-06-23 14:25]
上传包含问题的项目文件
 
[2018-06-24 18:47]
看来官方并未提供界面内元素是否加载完成的判定策略,我们暂时只能使用这种模式了,而且这种模式不需要在入口代码用Laya.loader预先加载什么,当然atlas除外。


// 由于Skeleton内部有个_templet,只有这个变量真的接收到Templet对象后才算是Skeleton准备就绪了,
// 因此,我们在最开始设计了一个预加载过程,不断检测ui中拖入的Skeleton类的对象的_templet是否都就绪了,
// 然后才开始正式的ui逻辑,代码大概就是下面这样
// Test01是ui的逻辑类
var Test01 = (function (_super) {
    function Test01() {
        Test01.__super.call(this);// 调试用,看看过了多少帧,才就绪
        this.numPreloadCalls = 0;
// 执行预加载
        this.preload(this.onPreloaded.bind(this)); 
    } 
    Laya.class(Test01, 'view.Test01', _super); 
    var _proto = Test01.prototype; 
    _proto.preload = function (complete) {
        console.log("preload..." + (++this.numPreloadCalls)); 
        if (this.dragon_sk._templet) {
            complete();
        } else {
            Laya.timer.frameOnce(1, this, this.preload, [complete]);
        }
    } 
    _proto.onPreloaded = function () {
// 本想一上来就执行下面逻辑,但会报错说._templet为null
// 所以设计了上面的预加载过程,保证._templet不是null
        this.dragon_sk.play("jump", true);
    } 
    return Test01;
})(Test01UI)


已邀请:

Aar0n

赞同来自:

确定使用的方式,和代码都是正确的?

geo

赞同来自:

假如ui中已经拖入了dragon.sk,形成SkeletonPlayer,并且命名为var为dragon,在ui设计器中,dragon已经正常动起来了。
而且,如果ui相关的逻辑代码不操作dragon,则运行起来很正常,它就在那里播放默认的动作。
但如果要在逻辑代码中一上来就:
this.dragon.play("idle", true); // 我这里会报错,说内部_template为null

你会怎么做?

要回复问题请先

商务合作
商务合作