package com.indyforge.twod.engine.graphics.rendering.scenegraph.transform; import com.indyforge.twod.engine.graphics.rendering.scenegraph.Entity; import com.indyforge.twod.engine.graphics.rendering.scenegraph.GraphicsEntity; import com.indyforge.twod.engine.util.iteration.FilteredIterator; import com.indyforge.twod.engine.util.iteration.IterationRoutines; import com.indyforge.twod.engine.util.iteration.TypeFilter; /** * Represents an abstract target. A target is basically something which can be * reached by transforming the controlled entity. This class uses the * {@link TransformMotor} to apply transformations. * * @author Christopher Probst * * @param <D> * The destination type. */ public abstract class Target<D> extends EntityTask<D, GraphicsEntity> { /** * */ private static final long serialVersionUID = 1L; /* * The transform motor. */ private final TransformMotor transformMotor; /** * Uses the {@link TransformMotor} to transform the controlled graphics * entity every frame using the given state. * * @param state * The state. */ protected abstract void transform(D state); /** * @return the state of the controlled entity. */ protected abstract D state(); /** * Create a new abstract target. * * @param controlled * The controlled graphics entity. * @param destination * The destination you want to reach. * @param velocity * The velocity to reach the target. */ public Target(GraphicsEntity controlled, D destination, float velocity) { super(controlled, destination, velocity); // Lookup motor TransformMotor ptr = (TransformMotor) IterationRoutines .next(new FilteredIterator<Entity>(new TypeFilter( TransformMotor.class, true), controlled.childIterator( false, false))); if (ptr == null) { throw new IllegalArgumentException("The controlled entity does " + "not have a transform motor as child"); } else { // Save the parameters transformMotor = ptr; } } /** * @return the difference between the destination and the state. */ public abstract D diff(); /** * @return the transform motor. */ public TransformMotor transformMotor() { return transformMotor; } /* * (non-Javadoc) * * @see com.indyforge.twod.engine.util.task.CancellableTask#cancel() */ @Override public void cancel() { transform(null); } }