[][临时解决]bug?加载sk问题
在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)
没有找到相关结果
要回复问题请先登录
3 个回复
Aar0n
赞同来自:
geo
赞同来自:
而且,如果ui相关的逻辑代码不操作dragon,则运行起来很正常,它就在那里播放默认的动作。
但如果要在逻辑代码中一上来就:
this.dragon.play("idle", true); // 我这里会报错,说内部_template为null
你会怎么做?
Aar0n
赞同来自:
http://layaair.ldc.layabox.com/demo/?category=2d&group=Skeleton&name=ChangeSkin
这些都有例子告诉怎么做