|
@@ -32,20 +32,32 @@
|
|
#import <spine/spine-cocos2d-objc.h>
|
|
#import <spine/spine-cocos2d-objc.h>
|
|
#import <spine/extension.h>
|
|
#import <spine/extension.h>
|
|
|
|
|
|
-static void animationCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
|
|
|
|
- [(SkeletonAnimation*)state->rendererObject onAnimationStateEvent:trackIndex type:type event:event loopCount:loopCount];
|
|
|
|
-}
|
|
|
|
|
|
+typedef struct _TrackEntryListeners {
|
|
|
|
+ spStartListener startListener;
|
|
|
|
+ spInterruptListener interruptListener;
|
|
|
|
+ spEndListener endListener;
|
|
|
|
+ spDisposeListener disposeListener;
|
|
|
|
+ spCompleteListener completeListener;
|
|
|
|
+ spEventListener eventListener;
|
|
|
|
+} _TrackEntryListeners;
|
|
|
|
|
|
-void trackEntryCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
|
|
|
|
- [(SkeletonAnimation*)state->rendererObject onTrackEntryEvent:trackIndex type:type event:event loopCount:loopCount];
|
|
|
|
|
|
+static void animationCallback (spAnimationState* state, spEventType type, spTrackEntry* entry, spEvent* event) {
|
|
|
|
+ [(SkeletonAnimation*)state->rendererObject onAnimationStateEvent:entry type:type event:event];
|
|
}
|
|
}
|
|
|
|
|
|
-typedef struct _TrackEntryListeners {
|
|
|
|
- spStartListener startListener;
|
|
|
|
- spEndListener endListener;
|
|
|
|
- spCompleteListener completeListener;
|
|
|
|
- spEventListener eventListener;
|
|
|
|
-} _TrackEntryListeners;
|
|
|
|
|
|
+void trackEntryCallback (spAnimationState* state, spEventType type, spTrackEntry* entry, spEvent* event) {
|
|
|
|
+ [(SkeletonAnimation*)state->rendererObject onTrackEntryEvent:entry type:type event:event];
|
|
|
|
+ if (type == SP_ANIMATION_DISPOSE) {
|
|
|
|
+ if (entry->rendererObject) {
|
|
|
|
+ _TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
|
|
|
|
+ [listeners->startListener release];
|
|
|
|
+ [listeners->endListener release];
|
|
|
|
+ [listeners->completeListener release];
|
|
|
|
+ [listeners->eventListener release];
|
|
|
|
+ FREE(listeners);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
|
|
static _TrackEntryListeners* getListeners (spTrackEntry* entry) {
|
|
static _TrackEntryListeners* getListeners (spTrackEntry* entry) {
|
|
if (!entry->rendererObject) {
|
|
if (!entry->rendererObject) {
|
|
@@ -55,18 +67,6 @@ static _TrackEntryListeners* getListeners (spTrackEntry* entry) {
|
|
return (_TrackEntryListeners*)entry->rendererObject;
|
|
return (_TrackEntryListeners*)entry->rendererObject;
|
|
}
|
|
}
|
|
|
|
|
|
-void disposeTrackEntry (spTrackEntry* entry) {
|
|
|
|
- if (entry->rendererObject) {
|
|
|
|
- _TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
|
|
|
|
- [listeners->startListener release];
|
|
|
|
- [listeners->endListener release];
|
|
|
|
- [listeners->completeListener release];
|
|
|
|
- [listeners->eventListener release];
|
|
|
|
- FREE(listeners);
|
|
|
|
- }
|
|
|
|
- _spTrackEntry_dispose(entry);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
//
|
|
//
|
|
|
|
|
|
@interface SkeletonAnimation (Private)
|
|
@interface SkeletonAnimation (Private)
|
|
@@ -103,7 +103,6 @@ void disposeTrackEntry (spTrackEntry* entry) {
|
|
_state->listener = animationCallback;
|
|
_state->listener = animationCallback;
|
|
|
|
|
|
_spAnimationState* stateInternal = (_spAnimationState*)_state;
|
|
_spAnimationState* stateInternal = (_spAnimationState*)_state;
|
|
- stateInternal->disposeTrackEntry = disposeTrackEntry;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- (id) initWithData:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
|
|
- (id) initWithData:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
|
|
@@ -138,7 +137,9 @@ void disposeTrackEntry (spTrackEntry* entry) {
|
|
spAnimationState_dispose(_state);
|
|
spAnimationState_dispose(_state);
|
|
|
|
|
|
[_startListener release];
|
|
[_startListener release];
|
|
|
|
+ [_interruptListener release];
|
|
[_endListener release];
|
|
[_endListener release];
|
|
|
|
+ [_disposeListener release];
|
|
[_completeListener release];
|
|
[_completeListener release];
|
|
[_eventListener release];
|
|
[_eventListener release];
|
|
|
|
|
|
@@ -199,39 +200,50 @@ void disposeTrackEntry (spTrackEntry* entry) {
|
|
spAnimationState_clearTrack(_state, trackIndex);
|
|
spAnimationState_clearTrack(_state, trackIndex);
|
|
}
|
|
}
|
|
|
|
|
|
-- (void) onAnimationStateEvent:(int)trackIndex type:(spEventType)type event:(spEvent*)event loopCount:(int)loopCount {
|
|
|
|
|
|
+- (void) onAnimationStateEvent:(spTrackEntry*)entry type:(spEventType)type event:(spEvent*)event {
|
|
switch (type) {
|
|
switch (type) {
|
|
case SP_ANIMATION_START:
|
|
case SP_ANIMATION_START:
|
|
- if (_startListener) _startListener(trackIndex);
|
|
|
|
|
|
+ if (_startListener) _startListener(entry);
|
|
break;
|
|
break;
|
|
|
|
+ case SP_ANIMATION_INTERRUPT:
|
|
|
|
+ if (_interruptListener) _interruptListener(entry);
|
|
|
|
+ break;
|
|
case SP_ANIMATION_END:
|
|
case SP_ANIMATION_END:
|
|
- if (_endListener) _endListener(trackIndex);
|
|
|
|
|
|
+ if (_endListener) _endListener(entry);
|
|
break;
|
|
break;
|
|
|
|
+ case SP_ANIMATION_DISPOSE:
|
|
|
|
+ if (_disposeListener) _disposeListener(entry);
|
|
|
|
+ break;
|
|
case SP_ANIMATION_COMPLETE:
|
|
case SP_ANIMATION_COMPLETE:
|
|
- if (_completeListener) _completeListener(trackIndex, loopCount);
|
|
|
|
|
|
+ if (_completeListener) _completeListener(entry);
|
|
break;
|
|
break;
|
|
case SP_ANIMATION_EVENT:
|
|
case SP_ANIMATION_EVENT:
|
|
- if (_eventListener) _eventListener(trackIndex, event);
|
|
|
|
|
|
+ if (_eventListener) _eventListener(entry, event);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-- (void) onTrackEntryEvent:(int)trackIndex type:(spEventType)type event:(spEvent*)event loopCount:(int)loopCount {
|
|
|
|
- spTrackEntry* entry = spAnimationState_getCurrent(_state, trackIndex);
|
|
|
|
|
|
+- (void) onTrackEntryEvent:(spTrackEntry*)entry type:(spEventType)type event:(spEvent*)event {
|
|
if (!entry->rendererObject) return;
|
|
if (!entry->rendererObject) return;
|
|
_TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
|
|
_TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
|
|
switch (type) {
|
|
switch (type) {
|
|
case SP_ANIMATION_START:
|
|
case SP_ANIMATION_START:
|
|
- if (listeners->startListener) listeners->startListener(trackIndex);
|
|
|
|
|
|
+ if (listeners->startListener) listeners->startListener(entry);
|
|
break;
|
|
break;
|
|
|
|
+ case SP_ANIMATION_INTERRUPT:
|
|
|
|
+ if (listeners->interruptListener) listeners->interruptListener(entry);
|
|
|
|
+ break;
|
|
case SP_ANIMATION_END:
|
|
case SP_ANIMATION_END:
|
|
- if (listeners->endListener) listeners->endListener(trackIndex);
|
|
|
|
|
|
+ if (listeners->endListener) listeners->endListener(entry);
|
|
break;
|
|
break;
|
|
|
|
+ case SP_ANIMATION_DISPOSE:
|
|
|
|
+ if (listeners->disposeListener) listeners->disposeListener(entry);
|
|
|
|
+ break;
|
|
case SP_ANIMATION_COMPLETE:
|
|
case SP_ANIMATION_COMPLETE:
|
|
- if (listeners->completeListener) listeners->completeListener(trackIndex, loopCount);
|
|
|
|
|
|
+ if (listeners->completeListener) listeners->completeListener(entry);
|
|
break;
|
|
break;
|
|
case SP_ANIMATION_EVENT:
|
|
case SP_ANIMATION_EVENT:
|
|
- if (listeners->eventListener) listeners->eventListener(trackIndex, event);
|
|
|
|
|
|
+ if (listeners->eventListener) listeners->eventListener(entry, event);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -240,10 +252,18 @@ void disposeTrackEntry (spTrackEntry* entry) {
|
|
getListeners(entry)->startListener = [listener copy];
|
|
getListeners(entry)->startListener = [listener copy];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void) setListenerForEntry:(spTrackEntry*)entry onInterrupt:(spInterruptListener)listener {
|
|
|
|
+ getListeners(entry)->interruptListener = [listener copy];
|
|
|
|
+}
|
|
|
|
+
|
|
- (void) setListenerForEntry:(spTrackEntry*)entry onEnd:(spEndListener)listener {
|
|
- (void) setListenerForEntry:(spTrackEntry*)entry onEnd:(spEndListener)listener {
|
|
getListeners(entry)->endListener = [listener copy];
|
|
getListeners(entry)->endListener = [listener copy];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void) setListenerForEntry:(spTrackEntry*)entry onDispose:(spDisposeListener)listener {
|
|
|
|
+ getListeners(entry)->disposeListener = [listener copy];
|
|
|
|
+}
|
|
|
|
+
|
|
- (void) setListenerForEntry:(spTrackEntry*)entry onComplete:(spCompleteListener)listener {
|
|
- (void) setListenerForEntry:(spTrackEntry*)entry onComplete:(spCompleteListener)listener {
|
|
getListeners(entry)->completeListener = [listener copy];
|
|
getListeners(entry)->completeListener = [listener copy];
|
|
}
|
|
}
|