/*******************************************************************************
* 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;
import com.badlogic.gdx.scenes.scene2d.actions.DelayAction;
import com.badlogic.gdx.scenes.scene2d.actions.TemporalAction;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pool.Poolable;
/** Actions attach to an {@link Actor} and perform some task, often over time.
* @author Nathan Sweet */
abstract public class Action implements Poolable {
/** The actor this action is attached to, or null if it is not attached. */
protected Actor actor;
/** The actor this action targets, or null if a target has not been set. */
protected Actor target;
private Pool pool;
/** Updates the action based on time. Typically this is called each frame by {@link Actor#act(float)}.
* @param delta Time in seconds since the last frame.
* @return true if the action is done. This method may continue to be called after the action is done. */
abstract public boolean act (float delta);
/** Sets the state of the action so it can be run again. */
public void restart () {
}
/** Sets the actor this action is attached to. This also sets the {@link #setTarget(Actor) target} actor if it is null. This
* method is called automatically when an action is added to an actor. This method is also called with null when an action is
* removed from an actor.
* <p>
* When set to null, if the action has a {@link #setPool(Pool) pool} then the action is {@link Pool#free(Object) returned} to
* the pool (which calls {@link #reset()}) and the pool is set to null. If the action does not have a pool, {@link #reset()} is
* not called.
* <p>
* This method is not typically a good place for an action subclass to query the actor's state because the action may not be
* executed for some time, eg it may be {@link DelayAction delayed}. The actor's state is best queried in the first call to
* {@link #act(float)}. For a {@link TemporalAction}, use TemporalAction#begin(). */
public void setActor (Actor actor) {
this.actor = actor;
if (target == null) setTarget(actor);
if (actor == null) {
if (pool != null) {
pool.free(this);
pool = null;
}
}
}
/** @return null if the action is not attached to an actor. */
public Actor getActor () {
return actor;
}
/** Sets the actor this action will manipulate. If no target actor is set, {@link #setActor(Actor)} will set the target actor
* when the action is added to an actor. */
public void setTarget (Actor target) {
this.target = target;
}
/** @return null if the action has no target. */
public Actor getTarget () {
return target;
}
/** Resets the optional state of this action to as if it were newly created, allowing the action to be pooled and reused. State
* required to be set for every usage of this action or computed during the action does not need to be reset.
* <p>
* The default implementation calls {@link #restart()}.
* <p>
* If a subclass has optional state, it must override this method, call super, and reset the optional state. */
public void reset () {
actor = null;
target = null;
pool = null;
restart();
}
public Pool getPool () {
return pool;
}
/** Sets the pool that the action will be returned to when removed from the actor.
* @param pool May be null.
* @see #setActor(Actor) */
public void setPool (Pool pool) {
this.pool = pool;
}
public String toString () {
String name = getClass().getName();
int dotIndex = name.lastIndexOf('.');
if (dotIndex != -1) name = name.substring(dotIndex + 1);
if (name.endsWith("Action")) name = name.substring(0, name.length() - 6);
return name;
}
}