[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);
}
}
目前在网上搜到的解决停留问题的方法大致两种:
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);
}
}
没有找到相关结果
已邀请:
要回复问题请先登录
1 个回复
Aar0n
赞同来自: