diff --git a/CHANGELOG.md b/CHANGELOG.md index 81f1be1e4..9bd8eaa93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ## C++ * ** Additions ** +* `AnimationState` and `TrackEntry` now also accept a subclass of `AnimationStateListenerObject` as a listener for animation events in the overloaded `setListener()` method. * **Breaking changes** diff --git a/spine-cpp/spine-cpp/include/spine/AnimationState.h b/spine-cpp/spine-cpp/include/spine/AnimationState.h index d0dd79e80..6b9c1e5a6 100644 --- a/spine-cpp/spine-cpp/include/spine/AnimationState.h +++ b/spine-cpp/spine-cpp/include/spine/AnimationState.h @@ -60,11 +60,10 @@ namespace spine { typedef void (*AnimationStateListener) (AnimationState* state, EventType type, TrackEntry* entry, Event* event); /// Abstract class to inherit from to create a callback object - class SP_API AnimationStateListenerClass - { + class SP_API AnimationStateListenerObject { public: - AnimationStateListenerClass() = default; - virtual ~AnimationStateListenerClass() = default; + AnimationStateListenerObject() = default; + virtual ~AnimationStateListenerObject() = default; public: /// The callback function to be called virtual void callback(AnimationState* state, EventType type, TrackEntry* entry, Event* event) = 0; @@ -252,7 +251,7 @@ namespace spine { void setListener(AnimationStateListener listener); - void setListener(AnimationStateListenerClass* listener); + void setListener(AnimationStateListenerObject* listener); private: Animation* _animation; @@ -272,7 +271,7 @@ namespace spine { Vector _timelineHoldMix; Vector _timelinesRotation; AnimationStateListener _listener; - AnimationStateListenerClass* _listenerObj; + AnimationStateListenerObject* _listenerObject; void reset(); }; @@ -410,7 +409,7 @@ namespace spine { void setTimeScale(float inValue); void setListener(AnimationStateListener listener); - void setListener(AnimationStateListenerClass* listener); + void setListener(AnimationStateListenerObject* listener); void disableQueue(); void enableQueue(); @@ -428,7 +427,7 @@ namespace spine { bool _animationsChanged; AnimationStateListener _listener; - AnimationStateListenerClass* _listenerObj; + AnimationStateListenerObject* _listenerObject; float _timeScale; diff --git a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp index 4f0731e82..53b6b17da 100644 --- a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp +++ b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp @@ -59,7 +59,7 @@ TrackEntry::TrackEntry() : _animation(NULL), _next(NULL), _mixingFrom(NULL), _mi _animationEnd(0), _animationLast(0), _nextAnimationLast(0), _delay(0), _trackTime(0), _trackLast(0), _nextTrackLast(0), _trackEnd(0), _timeScale(1.0f), _alpha(0), _mixTime(0), _mixDuration(0), _interruptAlpha(0), _totalAlpha(0), _mixBlend(MixBlend_Replace), - _listener(dummyOnAnimationEventFunc), _listenerObj(NULL) { + _listener(dummyOnAnimationEventFunc), _listenerObject(NULL) { } TrackEntry::~TrackEntry() { } @@ -164,12 +164,12 @@ void TrackEntry::resetRotationDirections() { void TrackEntry::setListener(AnimationStateListener inValue) { _listener = inValue; - _listenerObj = NULL; + _listenerObject = NULL; } -void TrackEntry::setListener(AnimationStateListenerClass* inValue) { +void TrackEntry::setListener(AnimationStateListenerObject* inValue) { _listener = dummyOnAnimationEventFunc; - _listenerObj = inValue; + _listenerObject = inValue; } void TrackEntry::reset() { @@ -185,7 +185,7 @@ void TrackEntry::reset() { _timelinesRotation.clear(); _listener = dummyOnAnimationEventFunc; - _listenerObj = NULL; + _listenerObject = NULL; } EventQueueEntry::EventQueueEntry(EventType eventType, TrackEntry *trackEntry, Event *event) : @@ -255,48 +255,32 @@ void EventQueue::drain() { case EventType_Start: case EventType_Interrupt: case EventType_Complete: - if (NULL == trackEntry->_listenerObj) - trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL); - else - trackEntry->_listenerObj->callback(&state, queueEntry->_type, trackEntry, NULL); - if (NULL == state._listenerObj) - state._listener(&state, queueEntry->_type, trackEntry, NULL); - else - state._listenerObj->callback(&state, queueEntry->_type, trackEntry, NULL); + if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL); + else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL); + if(!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, NULL); + else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL); break; case EventType_End: - if (NULL == trackEntry->_listenerObj) - trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL); - else - trackEntry->_listenerObj->callback(&state, queueEntry->_type, trackEntry, NULL); - if (NULL == state._listenerObj) - state._listener(&state, queueEntry->_type, trackEntry, NULL); - else - state._listenerObj->callback(&state, queueEntry->_type, trackEntry, NULL); + if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL); + else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL); + if (!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, NULL); + else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL); /* Yes, we want to fall through here */ case EventType_Dispose: - if (NULL == trackEntry->_listenerObj) - trackEntry->_listener(&state, EventType_Dispose, trackEntry, NULL); - else - trackEntry->_listenerObj->callback(&state, EventType_Dispose, trackEntry, NULL); - if (NULL == state._listenerObj) - state._listener(&state, EventType_Dispose, trackEntry, NULL); - else - state._listenerObj->callback(&state, EventType_Dispose, trackEntry, NULL); + if (!trackEntry->_listenerObject) trackEntry->_listener(&state, EventType_Dispose, trackEntry, NULL); + else trackEntry->_listenerObject->callback(&state, EventType_Dispose, trackEntry, NULL); + if (!state._listenerObject) state._listener(&state, EventType_Dispose, trackEntry, NULL); + else state._listenerObject->callback(&state, EventType_Dispose, trackEntry, NULL); trackEntry->reset(); _trackEntryPool.free(trackEntry); break; case EventType_Event: - if (NULL == trackEntry->_listenerObj) - trackEntry->_listener(&state, queueEntry->_type, trackEntry, queueEntry->_event); - else - trackEntry->_listenerObj->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event); - if (NULL == state._listenerObj) - state._listener(&state, queueEntry->_type, trackEntry, queueEntry->_event); - else - state._listenerObj->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event); + if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry->_type, trackEntry, queueEntry->_event); + else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event); + if (!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, queueEntry->_event); + else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event); break; } } @@ -316,7 +300,7 @@ AnimationState::AnimationState(AnimationStateData *data) : _queue(EventQueue::newEventQueue(*this, _trackEntryPool)), _animationsChanged(false), _listener(dummyOnAnimationEventFunc), - _listenerObj(NULL), + _listenerObject(NULL), _timeScale(1) { } @@ -652,12 +636,12 @@ void AnimationState::setTimeScale(float inValue) { void AnimationState::setListener(AnimationStateListener inValue) { _listener = inValue; - _listenerObj = NULL; + _listenerObject = NULL; } -void AnimationState::setListener(AnimationStateListenerClass* inValue) { +void AnimationState::setListener(AnimationStateListenerObject* inValue) { _listener = dummyOnAnimationEventFunc; - _listenerObj = inValue; + _listenerObject = inValue; } void AnimationState::disableQueue() {