|
@@ -26,16 +26,18 @@
|
|
package com.esotericsoftware.spine;
|
|
package com.esotericsoftware.spine;
|
|
|
|
|
|
import com.badlogic.gdx.math.MathUtils;
|
|
import com.badlogic.gdx.math.MathUtils;
|
|
-import com.badlogic.gdx.utils.ObjectMap;
|
|
|
|
|
|
|
|
/** Stores mixing times between animations and automatically mixes them as animations change. */
|
|
/** Stores mixing times between animations and automatically mixes them as animations change. */
|
|
public class AnimationState {
|
|
public class AnimationState {
|
|
|
|
+ private final AnimationStateData data;
|
|
Animation current, previous;
|
|
Animation current, previous;
|
|
float currentTime, previousTime;
|
|
float currentTime, previousTime;
|
|
boolean currentLoop, previousLoop;
|
|
boolean currentLoop, previousLoop;
|
|
float mixTime, mixDuration;
|
|
float mixTime, mixDuration;
|
|
- final ObjectMap<Key, Float> animationToMixTime = new ObjectMap();
|
|
|
|
- final Key tempKey = new Key();
|
|
|
|
|
|
+
|
|
|
|
+ public AnimationState (AnimationStateData data) {
|
|
|
|
+ this.data = data;
|
|
|
|
+ }
|
|
|
|
|
|
public void apply (Skeleton skeleton) {
|
|
public void apply (Skeleton skeleton) {
|
|
if (current == null) return;
|
|
if (current == null) return;
|
|
@@ -55,16 +57,6 @@ public class AnimationState {
|
|
mixTime += delta;
|
|
mixTime += delta;
|
|
}
|
|
}
|
|
|
|
|
|
- /** Set the mixing duration between two animations. */
|
|
|
|
- public void setMixing (Animation from, Animation to, float duration) {
|
|
|
|
- if (from == null) throw new IllegalArgumentException("from cannot be null.");
|
|
|
|
- if (to == null) throw new IllegalArgumentException("to cannot be null.");
|
|
|
|
- Key key = new Key();
|
|
|
|
- key.a1 = from;
|
|
|
|
- key.a2 = to;
|
|
|
|
- animationToMixTime.put(key, duration);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/** Set the current animation. */
|
|
/** Set the current animation. */
|
|
public void setAnimation (Animation animation, boolean loop) {
|
|
public void setAnimation (Animation animation, boolean loop) {
|
|
setAnimation(animation, loop, 0);
|
|
setAnimation(animation, loop, 0);
|
|
@@ -75,10 +67,8 @@ public class AnimationState {
|
|
public void setAnimation (Animation animation, boolean loop, float time) {
|
|
public void setAnimation (Animation animation, boolean loop, float time) {
|
|
previous = null;
|
|
previous = null;
|
|
if (animation != null && current != null) {
|
|
if (animation != null && current != null) {
|
|
- tempKey.a1 = current;
|
|
|
|
- tempKey.a2 = animation;
|
|
|
|
- if (animationToMixTime.containsKey(tempKey)) {
|
|
|
|
- mixDuration = animationToMixTime.get(tempKey);
|
|
|
|
|
|
+ mixDuration = data.getMixing(current, animation);
|
|
|
|
+ if (mixDuration > 0) {
|
|
mixTime = 0;
|
|
mixTime = 0;
|
|
previous = current;
|
|
previous = current;
|
|
}
|
|
}
|
|
@@ -98,24 +88,7 @@ public class AnimationState {
|
|
return currentTime;
|
|
return currentTime;
|
|
}
|
|
}
|
|
|
|
|
|
- static class Key {
|
|
|
|
- Animation a1, a2;
|
|
|
|
-
|
|
|
|
- public int hashCode () {
|
|
|
|
- return 31 * (31 + a1.hashCode()) + a2.hashCode();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public boolean equals (Object obj) {
|
|
|
|
- if (this == obj) return true;
|
|
|
|
- if (obj == null) return false;
|
|
|
|
- Key other = (Key)obj;
|
|
|
|
- if (a1 == null) {
|
|
|
|
- if (other.a1 != null) return false;
|
|
|
|
- } else if (!a1.equals(other.a1)) return false;
|
|
|
|
- if (a2 == null) {
|
|
|
|
- if (other.a2 != null) return false;
|
|
|
|
- } else if (!a2.equals(other.a2)) return false;
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
|
|
+ public AnimationStateData getData () {
|
|
|
|
+ return data;
|
|
}
|
|
}
|
|
}
|
|
}
|