[LayaAirIDE 1.0]设置骨骼动画停留在某一帧/某一个时间点

Laya的骨骼动画运行的原理是基于时间点来的,实际上并没有帧的概念,或者说“帧”在这里的意义不大(懵逼),停留在某一帧实际上就是停留在某个时间点。假设源文件的播放速度的帧数是24(R),如果要停在第6帧(F),使用帧数转时间公式:T = F / R * 1000 = 250
 
目前在网上搜到的解决停留问题的方法大致两种:
1.源文件在指定帧添加事件,然后通过监听label事件来停止动画
缺陷:必须要先播放动画才能获取事件,也就是说如果你想停留的时间点较长时,该方法显然不可取。
 
2.播即停,Skeleton.prototype.play方法控制播放时间段(第4和第5个参数填同一时间即可)
缺陷:首次挺正常,但是接下来发现并没有什么效果,或者说效果不怎么准确,没深究过。
 
万般无奈下(其实是闲得蛋疼),参考Skeleton源码做出的改动,即将它停留在指定的时间点界面(可能写的不完善,但是基本功能是可以实现的,而且不影响后续正常播放)
 
代码如下:
// armature实际是Skeleton对象,由于私有变量会报错,才设为any;time停留的时间点;index动画下标,默认0
function onGotoAndStop(armature: any, time: number, index: number = 0): void {
    var player = armature.player;
    time /= player.playbackRate;    // 根据速率得出准确的单位时间
    // 停留的时间必须小于总时间
    if (time >= 0 && time <= player.playDuration) {
        let frame = time / player.cacheFrameRateInterval | 0;    // 实际帧数
        armature.stop();            // 停止当前动画
        if (armature._aniClipIndex != index) {
            armature._aniClipIndex = index;
            armature._curOriginalData = new Float32Array(armature._templet.getTotalkeyframesLength(index));
        }
        let graphics = armature._getGrahicsDataWithCache(index, frame);
        graphics ? armature.graphics = graphics : armature._createGraphics(frame);
    }
}
已邀请:

Aar0n

赞同来自:

感谢分享~!

要回复问题请先

商务合作
商务合作