[libgdx] Allow listeners to be removed from event callbacks.

closes #464
This commit is contained in:
NathanSweet 2019-10-14 14:01:42 +02:00
parent eb1c382a3b
commit 30a460d504

View File

@ -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();