ソースを参照

[libgdx] Fixed delay being negative, causing the track time to jump.

Nathan Sweet 3 ヶ月 前
コミット
262a0d270f

+ 19 - 11
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

@@ -636,10 +636,11 @@ public class AnimationState {
 		if (last == null) {
 			setCurrent(trackIndex, entry, true);
 			queue.drain();
+			if (delay < 0) delay = 0;
 		} else {
 			last.next = entry;
 			entry.previous = last;
-			if (delay <= 0) delay += last.getTrackComplete() - entry.mixDuration;
+			if (delay <= 0) delay = Math.max(delay + last.getTrackComplete() - entry.mixDuration, 0);
 		}
 
 		entry.delay = delay;
@@ -681,7 +682,7 @@ public class AnimationState {
 	 *         after the {@link AnimationStateListener#dispose(TrackEntry)} event occurs. */
 	public TrackEntry addEmptyAnimation (int trackIndex, float mixDuration, float delay) {
 		TrackEntry entry = addAnimation(trackIndex, emptyAnimation, false, delay);
-		if (delay <= 0) entry.delay += entry.mixDuration - mixDuration;
+		if (delay <= 0) entry.delay = Math.max(entry.delay + entry.mixDuration - mixDuration, 0);
 		entry.mixDuration = mixDuration;
 		entry.trackEnd = mixDuration;
 		return entry;
@@ -940,21 +941,23 @@ public class AnimationState {
 			this.loop = loop;
 		}
 
-		/** Seconds to postpone playing the animation. When this track entry is the current track entry, <code>delay</code>
-		 * postpones incrementing the {@link #getTrackTime()}. When this track entry is queued, <code>delay</code> is the time from
-		 * the start of the previous animation to when this track entry will become the current track entry (ie when the previous
-		 * track entry {@link TrackEntry#getTrackTime()} >= this track entry's <code>delay</code>).
+		/** Seconds to postpone playing the animation. Must be >= 0. When this track entry is the current track entry,
+		 * <code>delay</code> postpones incrementing the {@link #getTrackTime()}. When this track entry is queued,
+		 * <code>delay</code> is the time from the start of the previous animation to when this track entry will become the current
+		 * track entry (ie when the previous track entry {@link TrackEntry#getTrackTime()} >= this track entry's
+		 * <code>delay</code>).
 		 * <p>
 		 * {@link #getTimeScale()} affects the delay.
 		 * <p>
-		 * When using {@link AnimationState#addAnimation(int, Animation, boolean, float)} with a <code>delay</code> <= 0, the delay
-		 * is set using the mix duration from the {@link AnimationStateData}. If {@link #mixDuration} is set afterward, the delay
-		 * may need to be adjusted. */
+		 * When passing <code>delay</code> <= 0 to {@link AnimationState#addAnimation(int, Animation, boolean, float)} this
+		 * <code>delay</code> is set using a mix duration from {@link AnimationStateData}. To change the {@link #getMixDuration()}
+		 * afterward, use {@link #setMixDuration(float, float)} so this <code>delay</code> is adjusted. */
 		public float getDelay () {
 			return delay;
 		}
 
 		public void setDelay (float delay) {
+			if (delay < 0) throw new IllegalArgumentException("delay must be >= 0.");
 			this.delay = delay;
 		}
 
@@ -1211,7 +1214,12 @@ public class AnimationState {
 		 *           entry is looping, its next loop completion is used instead of its duration. */
 		public void setMixDuration (float mixDuration, float delay) {
 			this.mixDuration = mixDuration;
-			if (previous != null && delay <= 0) delay += previous.getTrackComplete() - mixDuration;
+			if (delay <= 0) {
+				if (previous != null)
+					delay = Math.max(delay + previous.getTrackComplete() - mixDuration, 0);
+				else
+					delay = 0;
+			}
 			this.delay = delay;
 		}
 
@@ -1275,7 +1283,7 @@ public class AnimationState {
 		}
 
 		/** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the
-		 * long way around when using {@link #alpha} and starting animations on other tracks.
+		 * long way around when using {@link #getAlpha()} and starting animations on other tracks.
 		 * <p>
 		 * Mixing with {@link MixBlend#replace} involves finding a rotation between two others, which has two possible solutions:
 		 * the short way or the long way around. The two rotations likely change over time, so which direction is the short or long