mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 09:46:02 +08:00
177 lines
5.3 KiB
C++
Executable File
177 lines
5.3 KiB
C++
Executable File
#include "SpineEventMonitor.h"
|
|
|
|
#include "KString.h"
|
|
|
|
#include "KMemory.h" // Last include
|
|
|
|
SpineEventMonitor::SpineEventMonitor(AnimationState* _pAnimationState /*= nullptr*/)
|
|
{
|
|
bLogging = false;
|
|
RegisterListener(_pAnimationState);
|
|
}
|
|
|
|
SpineEventMonitor::~SpineEventMonitor()
|
|
{
|
|
pAnimState = 0;
|
|
}
|
|
|
|
void SpineEventMonitor::RegisterListener(AnimationState * _pAnimationState)
|
|
{
|
|
// if (_pAnimationState)
|
|
// {
|
|
// _pAnimationState->rendererObject = this;
|
|
// _pAnimationState->listener = (spAnimationStateListener)&SpineEventMonitor::spineAnimStateHandler;
|
|
// }
|
|
// pAnimState = _pAnimationState;
|
|
}
|
|
|
|
bool SpineEventMonitor::isAnimationPlaying()
|
|
{
|
|
// if (pAnimState)
|
|
// {
|
|
// return spAnimationState_getCurrent(pAnimState, 0) != 0;
|
|
// }
|
|
return false;
|
|
}
|
|
|
|
void SpineEventMonitor::spineAnimStateHandler(AnimationState * state, int type, spTrackEntry * entry, spEvent * event)
|
|
{
|
|
// if (state && state->rendererObject)
|
|
// {
|
|
// SpineEventMonitor* pEventMonitor = (SpineEventMonitor*)state->rendererObject;
|
|
// pEventMonitor->OnSpineAnimationStateEvent(state, type, entry, event);
|
|
// }
|
|
}
|
|
|
|
void SpineEventMonitor::OnSpineAnimationStateEvent(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
|
|
{
|
|
// const char* eventName = 0;
|
|
// if (state == pAnimState)
|
|
// {
|
|
// // only monitor ours
|
|
// switch(type)
|
|
// {
|
|
// case SP_ANIMATION_START: eventName = "SP_ANIMATION_START"; break;
|
|
// case SP_ANIMATION_INTERRUPT: eventName = "SP_ANIMATION_INTERRUPT"; break;
|
|
// case SP_ANIMATION_END: eventName = "SP_ANIMATION_END"; break;
|
|
// case SP_ANIMATION_COMPLETE: eventName = "SP_ANIMATION_COMPLETE"; break;
|
|
// case SP_ANIMATION_DISPOSE: eventName = "SP_ANIMATION_DISPOSE"; break;
|
|
// case SP_ANIMATION_EVENT: eventName = "SP_ANIMATION_EVENT"; break;
|
|
// default:
|
|
// break;
|
|
// }
|
|
//
|
|
// if (bLogging && eventName && trackEntry && trackEntry->animation && trackEntry->animation->name)
|
|
// KOutputDebug(DEBUGLVL, "[%s : '%s']\n", eventName, trackEntry->animation->name);//*/
|
|
// }
|
|
}
|
|
|
|
InterruptMonitor::InterruptMonitor(AnimationState * _pAnimationState):
|
|
SpineEventMonitor(_pAnimationState)
|
|
{
|
|
bForceInterrupt = false;
|
|
mEventStackCursor = 0; // cursor used to track events
|
|
}
|
|
|
|
bool InterruptMonitor::isAnimationPlaying()
|
|
{
|
|
return !bForceInterrupt && SpineEventMonitor::isAnimationPlaying();
|
|
}
|
|
|
|
// Stops the animation on any occurance of the spEventType
|
|
InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType)
|
|
{
|
|
InterruptEvent ev;
|
|
ev.mEventType = theEventType;
|
|
mEventStack.push_back(ev);
|
|
return *this;
|
|
}
|
|
|
|
// Stops the animation when the [spEventType : 'animationName'] occurs
|
|
InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType, const std::string & theAnimationName)
|
|
{
|
|
InterruptEvent ev;
|
|
ev.mEventType = theEventType;
|
|
ev.mAnimName = theAnimationName;
|
|
mEventStack.push_back(ev);
|
|
return *this;
|
|
}
|
|
|
|
// stops the first encounter of spEventType on the specified TrackEntry
|
|
InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType, spTrackEntry * theTrackEntry)
|
|
{
|
|
InterruptEvent ev;
|
|
ev.mEventType = theEventType;
|
|
ev.mTrackEntry = theTrackEntry;
|
|
mEventStack.push_back(ev);
|
|
return *this;
|
|
}
|
|
|
|
// Stops on the first SP_ANIMATION_EVENT with the string payload of 'theEventTriggerName'
|
|
InterruptMonitor& InterruptMonitor::AddInterruptEventTrigger(const std::string & theEventTriggerName)
|
|
{
|
|
InterruptEvent ev;
|
|
// ev.mEventType = SP_ANIMATION_EVENT;
|
|
ev.mEventName = theEventTriggerName;
|
|
mEventStack.push_back(ev);
|
|
return *this;
|
|
}
|
|
|
|
void InterruptMonitor::OnSpineAnimationStateEvent(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
|
|
{
|
|
SpineEventMonitor::OnSpineAnimationStateEvent(state, type, trackEntry, event);
|
|
|
|
if (mEventStackCursor < mEventStack.size())
|
|
{
|
|
if (mEventStack[mEventStackCursor].matches(state, type, trackEntry, event))
|
|
{
|
|
++mEventStackCursor;
|
|
}
|
|
|
|
if (mEventStackCursor >= mEventStack.size())
|
|
{
|
|
bForceInterrupt = true;
|
|
OnMatchingComplete();
|
|
}
|
|
}
|
|
}
|
|
|
|
inline bool InterruptMonitor::InterruptEvent::matches(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
|
|
{
|
|
// Must match spEventType {SP_ANIMATION_START, SP_ANIMATION_INTERRUPT, SP_ANIMATION_END, SP_ANIMATION_COMPLETE, SP_ANIMATION_DISPOSE, SP_ANIMATION_EVENT }
|
|
// if (mEventType == type)
|
|
// {
|
|
// // Looking for specific TrackEntry by pointer
|
|
// if (mTrackEntry != 0)
|
|
// {
|
|
// return mTrackEntry == trackEntry;
|
|
// }
|
|
//
|
|
// // looking for Animation Track by name
|
|
// if (!mAnimName.empty())
|
|
// {
|
|
// if (trackEntry && trackEntry->animation && trackEntry->animation->name)
|
|
// {
|
|
// if (CompareNoCase(trackEntry->animation->name, mAnimName) == 0)
|
|
// {
|
|
// return true;
|
|
// }
|
|
// }
|
|
// return false;
|
|
// }
|
|
//
|
|
// // looking for Event String Text
|
|
// if (!mEventName.empty())
|
|
// {
|
|
// if (event && event->stringValue)
|
|
// {
|
|
// return (CompareNoCase(event->stringValue, mEventName) == 0);
|
|
// }
|
|
// return false;
|
|
// }
|
|
//
|
|
// return true; // waiting for ANY spEventType that matches
|
|
// }
|
|
return false;
|
|
}
|