com.badlogic.gdx.scenes.scene2d.actions.TemporalAction.java Source code

Java tutorial

Introduction

Here is the source code for com.badlogic.gdx.scenes.scene2d.actions.TemporalAction.java

Source

/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.scenes.scene2d.actions;

import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.utils.Pool;

/** Base class for actions that transition over time using the percent complete.
 * @author Nathan Sweet */
abstract public class TemporalAction extends Action {
    private float duration, time;
    private Interpolation interpolation;
    private boolean reverse, began, complete;

    public TemporalAction() {
    }

    public TemporalAction(float duration) {
        this.duration = duration;
    }

    public TemporalAction(float duration, Interpolation interpolation) {
        this.duration = duration;
        this.interpolation = interpolation;
    }

    public boolean act(float delta) {
        if (complete)
            return true;
        Pool pool = getPool();
        setPool(null); // Ensure this action can't be returned to the pool while executing.
        try {
            if (!began) {
                begin();
                began = true;
            }
            time += delta;
            complete = time >= duration;
            float percent;
            if (complete)
                percent = 1;
            else {
                percent = time / duration;
                if (interpolation != null)
                    percent = interpolation.apply(percent);
            }
            update(reverse ? 1 - percent : percent);
            if (complete)
                end();
            return complete;
        } finally {
            setPool(pool);
        }
    }

    /** Called the first time {@link #act(float)} is called. This is a good place to query the {@link #actor actor's} starting
     * state. */
    protected void begin() {
    }

    /** Called the last time {@link #act(float)} is called. */
    protected void end() {
    }

    /** Called each frame.
     * @param percent The percentage of completion for this action, growing from 0 to 1 over the duration. If
     *           {@link #setReverse(boolean) reversed}, this will shrink from 1 to 0. */
    abstract protected void update(float percent);

    /** Skips to the end of the transition. */
    public void finish() {
        time = duration;
    }

    public void restart() {
        time = 0;
        began = false;
        complete = false;
    }

    public void reset() {
        super.reset();
        reverse = false;
        interpolation = null;
    }

    /** Gets the transition time so far. */
    public float getTime() {
        return time;
    }

    /** Sets the transition time so far. */
    public void setTime(float time) {
        this.time = time;
    }

    public float getDuration() {
        return duration;
    }

    /** Sets the length of the transition in seconds. */
    public void setDuration(float duration) {
        this.duration = duration;
    }

    public Interpolation getInterpolation() {
        return interpolation;
    }

    public void setInterpolation(Interpolation interpolation) {
        this.interpolation = interpolation;
    }

    public boolean isReverse() {
        return reverse;
    }

    /** When true, the action's progress will go from 100% to 0%. */
    public void setReverse(boolean reverse) {
        this.reverse = reverse;
    }
}