from MoveAnimator.hpp:40
class MoveAnimator : public T
{
public:
MoveAnimator() :
T(),
moveAnimationRunning(false),
moveAnimationCounter(0),
moveAnimationDelay(0),
moveAnimationEndedCallback(0)
{
}
virtual ~MoveAnimator()
{
}
void setMoveAnimationEndedAction(GenericCallback<const MoveAnimator<T>& >& callback)
{
moveAnimationEndedCallback = &callback;
}
void clearMoveAnimationEndedAction()
{
moveAnimationEndedCallback = 0;
}
virtual void setMoveAnimationDelay(uint16_t delay)
{
moveAnimationDelay = delay;
}
virtual uint16_t getMoveAnimationDelay() const
{
return moveAnimationDelay;
}
virtual bool isRunning() const
{
return isMoveAnimationRunning();
}
virtual bool isMoveAnimationRunning() const
{
return moveAnimationRunning;
}
void startMoveAnimation(int16_t endX, int16_t endY, uint16_t duration, EasingEquation xProgressionEquation = &EasingEquations::linearEaseNone, EasingEquation yProgressionEquation = &EasingEquations::linearEaseNone)
{
if (!moveAnimationRunning)
{
Application::getInstance()->registerTimerWidget(this);
}
moveAnimationCounter = 0;
moveAnimationStartX = T::getX();
moveAnimationStartY = T::getY();
moveAnimationEndX = endX;
moveAnimationEndY = endY;
moveAnimationDuration = duration;
moveAnimationXEquation = xProgressionEquation;
moveAnimationYEquation = yProgressionEquation;
moveAnimationRunning = true;
if (moveAnimationDelay == 0 && moveAnimationDuration == 0)
{
nextMoveAnimationStep();
}
}
void cancelMoveAnimation()
{
if (moveAnimationRunning)
{
Application::getInstance()->unregisterTimerWidget(this);
moveAnimationRunning = false;
}
}
protected:
virtual void handleTickEvent()
{
T::handleTickEvent();
nextMoveAnimationStep();
}
void nextMoveAnimationStep()
{
if (moveAnimationRunning)
{
if (moveAnimationCounter < moveAnimationDelay)
{
moveAnimationCounter++;
}
else
{
if (moveAnimationCounter <= (uint32_t)(moveAnimationDelay + moveAnimationDuration))
{
uint32_t actualAnimationCounter = moveAnimationCounter - moveAnimationDelay;
int16_t deltaX = moveAnimationXEquation(actualAnimationCounter, 0, moveAnimationEndX - moveAnimationStartX, moveAnimationDuration);
int16_t deltaY = moveAnimationYEquation(actualAnimationCounter, 0, moveAnimationEndY - moveAnimationStartY, moveAnimationDuration);
T::moveTo(moveAnimationStartX + deltaX, moveAnimationStartY + deltaY);
moveAnimationCounter++;
}
if (moveAnimationCounter > (uint32_t)(moveAnimationDelay + moveAnimationDuration))
{
moveAnimationRunning = false;
moveAnimationCounter = 0;
Application::getInstance()->unregisterTimerWidget(this);
if (moveAnimationEndedCallback && moveAnimationEndedCallback->isValid())
{
moveAnimationEndedCallback->execute(*this);
}
}
}
}
}
protected:
bool moveAnimationRunning;
uint16_t moveAnimationCounter;
uint16_t moveAnimationDelay;
uint16_t moveAnimationDuration;
int16_t moveAnimationStartX;
int16_t moveAnimationStartY;
int16_t moveAnimationEndX;
int16_t moveAnimationEndY;
EasingEquation moveAnimationXEquation;
EasingEquation moveAnimationYEquation;
GenericCallback<const MoveAnimator<T>& >* moveAnimationEndedCallback;
};