浏览代码

Merge branch '3.7-beta' of https://github.com/esotericsoftware/spine-runtimes into 3.7-beta

badlogic 7 年之前
父节点
当前提交
2c73175d88
共有 1 个文件被更改,包括 17 次插入2 次删除
  1. 17 2
      spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

+ 17 - 2
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

@@ -171,7 +171,7 @@ public class AnimationState {
 		from.trackLast = from.nextTrackLast;
 		from.trackLast = from.nextTrackLast;
 
 
 		// Require mixTime > 0 to ensure the mixing from entry was applied at least once.
 		// Require mixTime > 0 to ensure the mixing from entry was applied at least once.
-		if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
+		if (to.mixTime > 0 && to.mixTime >= to.mixDuration) {
 			// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
 			// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
 			if (from.totalAlpha == 0 || to.mixDuration == 0) {
 			if (from.totalAlpha == 0 || to.mixDuration == 0) {
 				to.mixingFrom = from.mixingFrom;
 				to.mixingFrom = from.mixingFrom;
@@ -182,6 +182,13 @@ public class AnimationState {
 			return finished;
 			return finished;
 		}
 		}
 
 
+		// If to has 0 timeScale and is not the first entry, remove the mix and apply it one more time to return to the setup pose.
+		if (to.timeScale == 0 && to.mixingTo != null) {
+			to.timeScale = 1;
+			to.mixTime = 0;
+			to.mixDuration = 0;
+		}
+
 		from.trackTime += delta * from.timeScale;
 		from.trackTime += delta * from.timeScale;
 		to.mixTime += delta * to.timeScale;
 		to.mixTime += delta * to.timeScale;
 		return false;
 		return false;
@@ -488,7 +495,8 @@ public class AnimationState {
 		return setAnimation(trackIndex, animation, loop);
 		return setAnimation(trackIndex, animation, loop);
 	}
 	}
 
 
-	/** Sets the current animation for a track, discarding any queued animations.
+	/** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never
+	 * applied to a skeleton, it is replaced (not mixed from).
 	 * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
 	 * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
 	 *           duration. In either case {@link TrackEntry#getTrackEnd()} determines when the track is cleared.
 	 *           duration. In either case {@link TrackEntry#getTrackEnd()} determines when the track is cleared.
 	 * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept
 	 * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept
@@ -809,6 +817,7 @@ public class AnimationState {
 		float delay, trackTime, trackLast, nextTrackLast, trackEnd, timeScale;
 		float delay, trackTime, trackLast, nextTrackLast, trackEnd, timeScale;
 		float alpha, mixTime, mixDuration, interruptAlpha, totalAlpha;
 		float alpha, mixTime, mixDuration, interruptAlpha, totalAlpha;
 		MixBlend mixBlend = MixBlend.replace;
 		MixBlend mixBlend = MixBlend.replace;
+
 		final IntArray timelineMode = new IntArray();
 		final IntArray timelineMode = new IntArray();
 		final Array<TrackEntry> timelineHoldMix = new Array();
 		final Array<TrackEntry> timelineHoldMix = new Array();
 		final FloatArray timelinesRotation = new FloatArray();
 		final FloatArray timelinesRotation = new FloatArray();
@@ -1066,6 +1075,12 @@ public class AnimationState {
 			return mixingFrom;
 			return mixingFrom;
 		}
 		}
 
 
+		/** The track entry for the next animation when mixing from this animation to the next animation, or null if no mixing is
+		 * currently occuring. When mixing to multiple animations, <code>mixingTo</code> makes up a linked list. */
+		public TrackEntry getMixingTo () {
+			return mixingTo;
+		}
+
 		public void setHoldPrevious (boolean holdPrevious) {
 		public void setHoldPrevious (boolean holdPrevious) {
 			this.holdPrevious = holdPrevious;
 			this.holdPrevious = holdPrevious;
 		}
 		}