com.badlogic.gdx.graphics.g2d.Animation Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* 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.graphics.g2d;
import java.util.List;
import com.badlogic.gdx.math.MathUtils;
/**
* An Animation stores a list of {@link TextureRegion}s representing an animated sequence, e.g. for running or jumping. Each
* region of an Animation is called a key frame, multiple key frames make up the animation.
*
*
* @author mzechner */
public class Animation {
public static final int NORMAL = 0;
public static final int REVERSED = 1;
public static final int LOOP = 2;
public static final int LOOP_REVERSED = 3;
public static final int LOOP_PINGPONG = 4;
public static final int LOOP_RANDOM = 5;
final TextureRegion[] keyFrames;
public final float frameDuration;
public final float animationDuration;
private int playMode = NORMAL;
/** Constructor, storing the frame duration and key frames.
*
* @param frameDuration the time between frames in seconds.
* @param keyFrames the {@link TextureRegion}s representing the frames. */
public Animation (float frameDuration, List keyFrames) {
this.frameDuration = frameDuration;
this.animationDuration = keyFrames.size() * frameDuration;
this.keyFrames = new TextureRegion[keyFrames.size()];
for (int i = 0, n = keyFrames.size(); i < n; i++) {
this.keyFrames[i] = (TextureRegion)keyFrames.get(i);
}
this.playMode = NORMAL;
}
/** Constructor, storing the frame duration, key frames and play type.
*
* @param frameDuration the time between frames in seconds.
* @param keyFrames the {@link TextureRegion}s representing the frames.
* @param playType the type of animation play (NORMAL, REVERSED, LOOP, LOOP_REVERSED, LOOP_PINGPONG, LOOP_RANDOM) */
public Animation (float frameDuration, List keyFrames, int playType) {
this.frameDuration = frameDuration;
this.animationDuration = keyFrames.size() * frameDuration;
this.keyFrames = new TextureRegion[keyFrames.size()];
for (int i = 0, n = keyFrames.size(); i < n; i++) {
this.keyFrames[i] = (TextureRegion)keyFrames.get(i);
}
this.playMode = playType;
}
/** Constructor, storing the frame duration and key frames.
*
* @param frameDuration the time between frames in seconds.
* @param keyFrames the {@link TextureRegion}s representing the frames. */
public Animation (float frameDuration, TextureRegion... keyFrames) {
this.frameDuration = frameDuration;
this.animationDuration = keyFrames.length * frameDuration;
this.keyFrames = keyFrames;
this.playMode = NORMAL;
}
/** Returns a {@link TextureRegion} based on the so called state time. This is the amount of seconds an object has spent in the
* state this Animation instance represents, e.g. running, jumping and so on. The mode specifies whether the animation is
* looping or not.
*
* @param stateTime the time spent in the state represented by this animation.
* @param looping whether the animation is looping or not.
* @return the TextureRegion representing the frame of animation for the given state time. */
public TextureRegion getKeyFrame (float stateTime, boolean looping) {
// we set the play mode by overriding the previous mode based on looping
// parameter value
if (looping && (playMode == NORMAL || playMode == REVERSED)) {
if (playMode == NORMAL)
playMode = LOOP;
else
playMode = LOOP_REVERSED;
} else if (!looping && !(playMode == NORMAL || playMode == REVERSED)) {
if (playMode == LOOP_REVERSED)
playMode = REVERSED;
else
playMode = LOOP;
}
return getKeyFrame(stateTime);
}
/** Returns a {@link TextureRegion} based on the so called state time. This is the amount of seconds an object has spent in the
* state this Animation instance represents, e.g. running, jumping and so on using the mode specified by {@link setPlayType}
* method.
*
* @param stateTime
* @return the TextureRegion representing the frame of animation for the given state time. */
public TextureRegion getKeyFrame (float stateTime) {
int frameNumber = (int)(stateTime / frameDuration);
switch (playMode) {
case NORMAL:
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
case LOOP:
frameNumber = frameNumber % keyFrames.length;
break;
case LOOP_PINGPONG:
frameNumber = frameNumber % (keyFrames.length * 2);
if (frameNumber >= keyFrames.length) frameNumber = keyFrames.length - 1 - (frameNumber - keyFrames.length);
break;
case LOOP_RANDOM:
frameNumber = MathUtils.random(keyFrames.length - 1);
break;
case REVERSED:
frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
break;
case LOOP_REVERSED:
frameNumber = frameNumber % keyFrames.length;
frameNumber = keyFrames.length - frameNumber - 1;
break;
default:
// play normal otherwise
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
}
return keyFrames[frameNumber];
}
/** Sets the animation play mode.
*
* @param playMode can be one of the following: Animation.NORMAL, Animation.REVERSED, Animation.LOOP, Animation.LOOP_REVERSED,
* Animation.LOOP_PINGPONG, Animation.LOOP_RANDOM */
public void setPlayMode (int playMode) {
this.playMode = playMode;
}
/**
* Whether the animation would be finished if played without looping
* (PlayMode Animation#NORMAL), given the state time.
* @param stateTime
* @return whether the animation is finished.
*/
public boolean isAnimationFinished (float stateTime) {
int frameNumber = (int)(stateTime / frameDuration);
return keyFrames.length - 1 < frameNumber;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy