-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Open
Labels
Description
Cocos Creator version
3.8.5
System information
all
Issue description
错误的代码如下
animation.setCompleteListener = function (listener) {
this._compeleteListener = listener;
this.setCompleteListenerNative(function (trackEntry) {
const loopCount = Math.floor(trackEntry.trackTime / trackEntry.animationEnd);
this._compeleteListener && this._compeleteListener(trackEntry, loopCount);
});
};
// The methods are added to be compatibility with old versions.
animation.setTrackCompleteListener = function (trackEntry, listener) {
this._trackCompeleteListener = listener;
this.setTrackCompleteListenerNative(trackEntry, function (trackEntryNative) {
const loopCount = Math.floor(trackEntryNative.trackTime / trackEntryNative.animationEnd);
this._trackCompeleteListener && this._trackCompeleteListener(trackEntryNative, loopCount);
});
};通过 trackTime 来计算 loopCount 的算法不对.
spine 官方api 的说明如下:
根据官方说明, trackTime = 0 , 时 animationTime = animationStart .
也就是说. trackTime 是作用于 animationStart 和 animationEnd 这个区间的.
比如, 一个动画的完整时长是 10秒.
那么 默认 的
trackEntry.animationStart = 0
trackEntry.animationEnd = 10
(以上代码并非我杜撰 从spine官方rumtime里可以看到类似逻辑 )
但是 spine是支持 自定义 动画播放区间的.
此时如果我使用了
trackEntry.animationStart = 3
trackEntry.animationEnd = 6
trackEntry.loop = true
让动画 在 3到6秒之间循环播放.
那么上面 计算loopCount 的逻辑就有问题了.
所以正确的方式应该是
const duration = trackEntryNative.animationEnd - trackEntryNative.animationStart;
const loopCount = Math.floor(trackEntryNative.trackTime / duration);
Relevant error log output
No response
Steps to reproduce
.
Minimal reproduction project
No response