mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[libgdx] Allow listeners to be removed from event callbacks.
closes #464
This commit is contained in:
parent
eb1c382a3b
commit
30a460d504
@ -37,6 +37,8 @@ import com.badlogic.gdx.utils.IntArray;
|
|||||||
import com.badlogic.gdx.utils.IntSet;
|
import com.badlogic.gdx.utils.IntSet;
|
||||||
import com.badlogic.gdx.utils.Pool;
|
import com.badlogic.gdx.utils.Pool;
|
||||||
import com.badlogic.gdx.utils.Pool.Poolable;
|
import com.badlogic.gdx.utils.Pool.Poolable;
|
||||||
|
import com.badlogic.gdx.utils.SnapshotArray;
|
||||||
|
|
||||||
import com.esotericsoftware.spine.Animation.AttachmentTimeline;
|
import com.esotericsoftware.spine.Animation.AttachmentTimeline;
|
||||||
import com.esotericsoftware.spine.Animation.DrawOrderTimeline;
|
import com.esotericsoftware.spine.Animation.DrawOrderTimeline;
|
||||||
import com.esotericsoftware.spine.Animation.EventTimeline;
|
import com.esotericsoftware.spine.Animation.EventTimeline;
|
||||||
@ -86,7 +88,7 @@ public class AnimationState {
|
|||||||
private AnimationStateData data;
|
private AnimationStateData data;
|
||||||
final Array<TrackEntry> tracks = new Array();
|
final Array<TrackEntry> tracks = new Array();
|
||||||
private final Array<Event> events = new Array();
|
private final Array<Event> events = new Array();
|
||||||
final Array<AnimationStateListener> listeners = new Array();
|
final SnapshotArray<AnimationStateListener> listeners = new SnapshotArray();
|
||||||
private final EventQueue queue = new EventQueue();
|
private final EventQueue queue = new EventQueue();
|
||||||
private final IntSet propertyIDs = new IntSet();
|
private final IntSet propertyIDs = new IntSet();
|
||||||
boolean animationsChanged;
|
boolean animationsChanged;
|
||||||
@ -1214,44 +1216,47 @@ public class AnimationState {
|
|||||||
drainDisabled = true;
|
drainDisabled = true;
|
||||||
|
|
||||||
Array objects = this.objects;
|
Array objects = this.objects;
|
||||||
Array<AnimationStateListener> listeners = AnimationState.this.listeners;
|
SnapshotArray<AnimationStateListener> listenersArray = AnimationState.this.listeners;
|
||||||
for (int i = 0; i < objects.size; i += 2) {
|
for (int i = 0; i < objects.size; i += 2) {
|
||||||
EventType type = (EventType)objects.get(i);
|
EventType type = (EventType)objects.get(i);
|
||||||
TrackEntry entry = (TrackEntry)objects.get(i + 1);
|
TrackEntry entry = (TrackEntry)objects.get(i + 1);
|
||||||
|
int listenersCount = listenersArray.size;
|
||||||
|
Object[] listeners = listenersArray.begin();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case start:
|
case start:
|
||||||
if (entry.listener != null) entry.listener.start(entry);
|
if (entry.listener != null) entry.listener.start(entry);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).start(entry);
|
((AnimationStateListener)listeners[ii]).start(entry);
|
||||||
break;
|
break;
|
||||||
case interrupt:
|
case interrupt:
|
||||||
if (entry.listener != null) entry.listener.interrupt(entry);
|
if (entry.listener != null) entry.listener.interrupt(entry);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).interrupt(entry);
|
((AnimationStateListener)listeners[ii]).interrupt(entry);
|
||||||
break;
|
break;
|
||||||
case end:
|
case end:
|
||||||
if (entry.listener != null) entry.listener.end(entry);
|
if (entry.listener != null) entry.listener.end(entry);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).end(entry);
|
((AnimationStateListener)listeners[ii]).end(entry);
|
||||||
// Fall through.
|
// Fall through.
|
||||||
case dispose:
|
case dispose:
|
||||||
if (entry.listener != null) entry.listener.dispose(entry);
|
if (entry.listener != null) entry.listener.dispose(entry);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).dispose(entry);
|
((AnimationStateListener)listeners[ii]).dispose(entry);
|
||||||
trackEntryPool.free(entry);
|
trackEntryPool.free(entry);
|
||||||
break;
|
break;
|
||||||
case complete:
|
case complete:
|
||||||
if (entry.listener != null) entry.listener.complete(entry);
|
if (entry.listener != null) entry.listener.complete(entry);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).complete(entry);
|
((AnimationStateListener)listeners[ii]).complete(entry);
|
||||||
break;
|
break;
|
||||||
case event:
|
case event:
|
||||||
Event event = (Event)objects.get(i++ + 2);
|
Event event = (Event)objects.get(i++ + 2);
|
||||||
if (entry.listener != null) entry.listener.event(entry, event);
|
if (entry.listener != null) entry.listener.event(entry, event);
|
||||||
for (int ii = 0; ii < listeners.size; ii++)
|
for (int ii = 0; ii < listenersCount; ii++)
|
||||||
listeners.get(ii).event(entry, event);
|
((AnimationStateListener)listeners[ii]).event(entry, event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
listenersArray.end();
|
||||||
}
|
}
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user