浏览代码

[libgdx] AnimationState, fixed rotation mix when direction changes.

closes #2158
Nathan Sweet 2 年之前
父节点
当前提交
3ea4f66642
共有 1 个文件被更改,包括 13 次插入9 次删除
  1. 13 9
      spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

+ 13 - 9
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

@@ -441,17 +441,21 @@ public class AnimationState {
 				lastTotal = 0;
 				lastTotal = 0;
 				lastDiff = diff;
 				lastDiff = diff;
 			} else {
 			} else {
-				lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.
-				lastDiff = timelinesRotation[i + 1]; // Difference between bones.
+				lastTotal = timelinesRotation[i];
+				lastDiff = timelinesRotation[i + 1];
 			}
 			}
-			boolean current = diff > 0, dir = lastTotal >= 0;
-			// Detect cross at 0 (not 180).
-			if (Math.signum(lastDiff) != Math.signum(diff) && Math.abs(lastDiff) <= 90) {
-				// A cross after a 360 rotation is a loop.
-				if (Math.abs(lastTotal) > 180) lastTotal += 360 * Math.signum(lastTotal);
-				dir = current;
+			float loops = lastTotal - lastTotal % 360;
+			total = diff + loops;
+			boolean current = diff >= 0, dir = lastTotal >= 0;
+			if (Math.abs(lastDiff) <= 90 && Math.signum(lastDiff) != Math.signum(diff)) {
+				if (Math.abs(lastTotal - loops) > 180) {
+					total += 360 * Math.signum(lastTotal);
+					dir = current;
+				} else if (loops != 0)
+					total -= 360 * Math.signum(lastTotal);
+				else
+					dir = current;
 			}
 			}
-			total = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal.
 			if (dir != current) total += 360 * Math.signum(lastTotal);
 			if (dir != current) total += 360 * Math.signum(lastTotal);
 			timelinesRotation[i] = total;
 			timelinesRotation[i] = total;
 		}
 		}