// // BaseTween.cpp // // This code is derived from Universal Tween Engine // Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0 // //#define NDEBUG #include #include namespace TweenEngine { void BaseTween::reset() { step = -2; repeatCnt = 0; isIterationStep = isYoyoFlag = false; delayStart = duration = repeatDelay = currentTime = deltaTime = 0; isStartedFlag = isInitializedFlag = isFinishedFlag = isKilledFlag = isPausedFlag = false; callback = nullptr; callbackTriggers = TweenCallback::COMPLETE; userData = nullptr; callbacks.clear(); isAutoRemoveEnabled = isAutoStartEnabled = true; } // API /** * Builds and validates the object. Only needed if you want to finalize a * tween or timeline without starting it, since a call to ".start()" also * calls this method. * * @return The current object, for chaining instructions. */ BaseTween &BaseTween::build() { return *this; } /** * Starts or restarts the object unmanaged. You will need to take care of * its life-cycle. If you want the tween to be managed for you, use a * {@link TweenManager}. * * @return The current object, for chaining instructions. */ BaseTween &BaseTween::start() { build(); currentTime = 0; isStartedFlag = true; return *this; } /** * Convenience method to add an object to a manager. Its life-cycle will be * handled for you. Relax and enjoy the animation. * * @return The current object, for chaining instructions. */ BaseTween &BaseTween::start(TweenManager &manager) { manager.add(*this); return *this; } /** * Adds a delay to the tween or timeline. * * @param delay A duration. * @return The current object, for chaining instructions. */ BaseTween &BaseTween::delay(float delay) { this->delayStart += delay; return *this; } /** * Kills the tween or timeline. If you are using a TweenManager, this object * will be removed automatically. */ void BaseTween::kill() { isKilledFlag = true; } /** * Stops and resets the tween or timeline, and sends it to its pool, for + * later reuse. Note that if you use a {@link TweenManager}, this method + * is automatically called once the animation is finished. */ void BaseTween::free() { } /** * Pauses the tween or timeline. Further update calls won't have any effect. */ void BaseTween::pause() { isPausedFlag = true; } /** * Resumes the tween or timeline. Has no effect is it was no already paused. */ void BaseTween::resume() { isPausedFlag = false; } /** * Repeats the tween or timeline for a given number of times. * @param count The number of repetitions. For infinite repetition, * use Tween.INFINITY, or a negative number. * * @param delay A delay between each iteration. * @return The current tween or timeline, for chaining instructions. */ BaseTween &BaseTween::repeat(int count, float delay) { if (isStartedFlag) { //throw new RuntimeException("You can't change the repetitions of a tween or timeline once it is started"); } else { repeatCnt = count; repeatDelay = delay >= 0 ? delay : 0; isYoyoFlag = false; } return *this; } /** * Repeats the tween or timeline for a given number of times. * Every two iterations, it will be played backwards. * * @param count The number of repetitions. For infinite repetition, * use Tween.INFINITY, or '-1'. * @param delay A delay before each repetition. * @return The current tween or timeline, for chaining instructions. */ BaseTween &BaseTween::repeatYoyo(int count, float delay) { if (isStartedFlag) { //throw new RuntimeException("You can't change the repetitions of a tween or timeline once it is started"); } else { repeatCnt = count; repeatDelay = delay >= 0 ? delay : 0; isYoyoFlag = true; } return *this; } /** * Sets the callback. By default, it will be fired at the completion of the * tween or timeline (event COMPLETE). If you want to change this behavior * and add more triggers, use the {@link setCallbackTriggers()} method. * * @see TweenCallback */ BaseTween &BaseTween::setCallback(TweenCallback *callback) { this->callback = callback; return *this; } BaseTween &BaseTween::setCallback(int type, const TweenCallbackFunction& callback) { callbacks[type] = callback; return *this; } /** * Changes the triggers of the callback. The available triggers, listed as * members of the {@link TweenCallback} interface, are: *

* * BEGIN: right after the delay (if any)
* START: at each iteration beginning
* END: at each iteration ending, before the repeat delay
* COMPLETE: at last END event
* BACK_BEGIN: at the beginning of the first backward iteration
* BACK_START: at each backward iteration beginning, after the repeat delay
* BACK_END: at each backward iteration ending
* BACK_COMPLETE: at last BACK_END event *

* *

 {@code
	 * forward :      BEGIN                                   COMPLETE
	 * forward :      START    END      START    END      START    END
	 * |--------------[XXXXXXXXXX]------[XXXXXXXXXX]------[XXXXXXXXXX]
	 * backward:      bEND  bSTART      bEND  bSTART      bEND  bSTART
	 * backward:      bCOMPLETE                                 bBEGIN
	 * }
* * @param flags one or more triggers, separated by the '|' operator. * @see TweenCallback */ BaseTween &BaseTween::setCallbackTriggers(int flags) { this->callbackTriggers = flags; return *this; } /** * Attaches an object to this tween or timeline. It can be useful in order * to retrieve some data from a TweenCallback. * * @param data Any kind of object. * @return The current tween or timeline, for chaining instructions. */ BaseTween &BaseTween::setUserData(void *data) { userData = data; return *this; } // ------------------------------------------------------------------------- // Getters // ------------------------------------------------------------------------- /** * Gets the delay of the tween or timeline. Nothing will happen before * this delay. */ float BaseTween::getDelay() { return delayStart; } /** * Gets the duration of a single iteration. */ float BaseTween::getDuration() { return duration; } /** * Gets the number of iterations that will be played. */ int BaseTween::getRepeatCount() { return repeatCnt; } /** * Gets the delay occuring between two iterations. */ float BaseTween::getRepeatDelay() { return repeatDelay; } /** * Returns the complete duration, including initial delay and repetitions. * The formula is as follows: *
	 * fullDuration = delay + duration + (repeatDelay + duration) * repeatCnt
	 * 
*/ float BaseTween::getFullDuration() { if (repeatCnt < 0) return -1; return delayStart + duration + (repeatDelay + duration) * repeatCnt; } /** * Gets the attached data, or null if none. */ void *BaseTween::getUserData() { return userData; } /** * Gets the id of the current step. Values are as follows:
*