Time scale, per AnimationState and per track.

This commit is contained in:
NathanSweet 2013-09-28 01:43:06 +02:00
parent 821c9ea38b
commit fc92128519
4 changed files with 37 additions and 17 deletions

View File

@ -55,19 +55,19 @@ struct TrackEntry {
TrackEntry* previous; TrackEntry* previous;
Animation* animation; Animation* animation;
int/*bool*/loop; int/*bool*/loop;
float delay, time, lastTime, endTime; float delay, time, lastTime, endTime, timeScale;
AnimationStateListener listener; AnimationStateListener listener;
float mixTime, mixDuration; float mixTime, mixDuration;
}; };
struct AnimationState { struct AnimationState {
AnimationStateData* const data; AnimationStateData* const data;
float timeScale;
AnimationStateListener listener;
void* context;
int trackCount; int trackCount;
TrackEntry** tracks; TrackEntry** tracks;
AnimationStateListener listener;
void* context;
}; };
/* @param data May be 0 for no mixing. */ /* @param data May be 0 for no mixing. */

View File

@ -43,6 +43,7 @@
TrackEntry* _TrackEntry_create () { TrackEntry* _TrackEntry_create () {
TrackEntry* entry = NEW(TrackEntry); TrackEntry* entry = NEW(TrackEntry);
entry->timeScale = 1;
return entry; return entry;
} }
@ -71,6 +72,7 @@ AnimationState* AnimationState_create (AnimationStateData* data) {
_AnimationState* internal = NEW(_AnimationState); _AnimationState* internal = NEW(_AnimationState);
AnimationState* self = SUPER(internal); AnimationState* self = SUPER(internal);
internal->events = MALLOC(Event*, 64); internal->events = MALLOC(Event*, 64);
self->timeScale = 1;
CONST_CAST(AnimationStateData*, self->data) = data; CONST_CAST(AnimationStateData*, self->data) = data;
return self; return self;
} }
@ -89,6 +91,7 @@ void AnimationState_update (AnimationState* self, float delta) {
TrackEntry* current = self->tracks[i]; TrackEntry* current = self->tracks[i];
if (!current) continue; if (!current) continue;
delta *= self->timeScale * current->timeScale;
time = current->time + delta; time = current->time + delta;
endTime = current->endTime; endTime = current->endTime;

View File

@ -40,8 +40,10 @@ namespace Spine {
private AnimationStateData data; private AnimationStateData data;
private List<TrackEntry> tracks = new List<TrackEntry>(); private List<TrackEntry> tracks = new List<TrackEntry>();
private List<Event> events = new List<Event>(); private List<Event> events = new List<Event>();
private float timeScale = 1;
public AnimationStateData Data { get { return data; } } public AnimationStateData Data { get { return data; } }
public float TimeScale { get { return timeScale; } set { timeScale = value; } }
public event EventHandler<StartEndArgs> Start; public event EventHandler<StartEndArgs> Start;
public event EventHandler<StartEndArgs> End; public event EventHandler<StartEndArgs> End;
@ -58,6 +60,7 @@ namespace Spine {
TrackEntry current = tracks[i]; TrackEntry current = tracks[i];
if (current == null) continue; if (current == null) continue;
delta *= timeScale * current.timeScale;
float time = current.time + delta; float time = current.time + delta;
float endTime = current.endTime; float endTime = current.endTime;
@ -264,21 +267,16 @@ namespace Spine {
internal TrackEntry next, previous; internal TrackEntry next, previous;
internal Animation animation; internal Animation animation;
internal bool loop; internal bool loop;
internal float delay, time, lastTime, endTime; internal float delay, time, lastTime, endTime, timeScale = 1;
internal float mixTime, mixDuration; internal float mixTime, mixDuration;
public Animation Animation { get { return animation; } } public Animation Animation { get { return animation; } }
public bool Loop { get { return loop; } set { loop = value; } }
public float Delay { get { return delay; } set { delay = value; } } public float Delay { get { return delay; } set { delay = value; } }
public float EndTime { get { return EndTime; } set { EndTime = value; } } public float Time { get { return time; } set { time = value; } }
public float LastTime { get { return lastTime; } set { lastTime = value; } }
public float Time { public float EndTime { get { return endTime; } set { endTime = value; } }
get { return time; } public float TimeScale { get { return timeScale; } set { timeScale = value; } }
set { public bool Loop { get { return loop; } set { loop = value; } }
time = value;
if (lastTime < value) lastTime = value;
}
}
public event EventHandler<StartEndArgs> Start; public event EventHandler<StartEndArgs> Start;
public event EventHandler<StartEndArgs> End; public event EventHandler<StartEndArgs> End;

View File

@ -43,6 +43,7 @@ public class AnimationState {
private Array<TrackEntry> tracks = new Array(); private Array<TrackEntry> tracks = new Array();
private final Array<Event> events = new Array(); private final Array<Event> events = new Array();
private final Array<AnimationStateListener> listeners = new Array(); private final Array<AnimationStateListener> listeners = new Array();
private float timeScale;
public AnimationState (AnimationStateData data) { public AnimationState (AnimationStateData data) {
if (data == null) throw new IllegalArgumentException("data cannot be null."); if (data == null) throw new IllegalArgumentException("data cannot be null.");
@ -54,6 +55,7 @@ public class AnimationState {
TrackEntry current = tracks.get(i); TrackEntry current = tracks.get(i);
if (current == null) continue; if (current == null) continue;
delta *= timeScale * current.timeScale;
float time = current.time + delta; float time = current.time + delta;
float endTime = current.endTime; float endTime = current.endTime;
@ -253,6 +255,14 @@ public class AnimationState {
listeners.removeValue(listener, true); listeners.removeValue(listener, true);
} }
public float getTimeScale () {
return timeScale;
}
public void setTimeScale (float timeScale) {
this.timeScale = timeScale;
}
public AnimationStateData getData () { public AnimationStateData getData () {
return data; return data;
} }
@ -273,14 +283,15 @@ public class AnimationState {
TrackEntry next, previous; TrackEntry next, previous;
Animation animation; Animation animation;
boolean loop; boolean loop;
float delay, time, lastTime, endTime; float delay, time, lastTime, endTime, timeScale = 1;
AnimationStateListener listener;
float mixTime, mixDuration; float mixTime, mixDuration;
AnimationStateListener listener;
public void reset () { public void reset () {
animation = null; animation = null;
listener = null; listener = null;
next = null; next = null;
timeScale = 1;
} }
public Animation getAnimation () { public Animation getAnimation () {
@ -339,6 +350,14 @@ public class AnimationState {
this.lastTime = lastTime; this.lastTime = lastTime;
} }
public float getTimeScale () {
return timeScale;
}
public void setTimeScale (float timeScale) {
this.timeScale = timeScale;
}
public TrackEntry getNext () { public TrackEntry getNext () {
return next; return next;
} }