package org.ripple.power.ui.projector.action.sprite;
import java.awt.Image;
import java.util.ArrayList;
import org.ripple.power.ui.projector.core.LRelease;
import org.ripple.power.utils.GraphicsUtils;
public class Animation implements LRelease {
private float alpha;
private boolean isRunning;
private ArrayList<AnimationFrame> frames;
private int currentFrameIndex;
private long animTime, totalDuration;
private SpriteImage sprImage = null;
public Animation() {
this(new ArrayList<AnimationFrame>(10), 0);
}
private Animation(ArrayList<AnimationFrame> frames, long totalDuration) {
this.frames = frames;
this.totalDuration = totalDuration;
this.isRunning = true;
start();
}
/**
* 转化指定文件为动画图像
*
* @param fileName
* @param row
* @param col
* @param timer
* @return
*/
public static Animation getDefaultAnimation(String fileName, int row,
int col, int timer) {
return Animation.getDefaultAnimation(
GraphicsUtils.getSplitImages(fileName, row, col, false), -1,
timer);
}
/**
* 转化指定文件为动画图像
*
* @param fileName
* @param maxFrame
* @param row
* @param col
* @param timer
* @return
*/
public static Animation getDefaultAnimation(String fileName, int maxFrame,
int row, int col, int timer) {
return Animation.getDefaultAnimation(
GraphicsUtils.getSplitImages(fileName, row, col, false),
maxFrame, timer);
}
/**
* 转化一组Image为动画图像
*
* @param images
* @param maxFrame
* @param row
* @param col
* @param timer
* @return
*/
public static Animation getDefaultAnimation(Image[] images, int maxFrame,
int timer) {
Animation animation = new Animation();
if (maxFrame != -1) {
for (int i = 0; i < maxFrame; i++) {
animation.addFrame(new SpriteImage(images[i]), timer);
}
} else {
for (int i = 0; i < images.length; i++) {
animation.addFrame(new SpriteImage(images[i]), timer);
}
}
return animation;
}
/**
* 克隆一个独立动画
*/
public Object clone() {
return new Animation(frames, totalDuration);
}
/**
* 添加一个动画图像
*
* @param image
* @param timer
*/
public synchronized void addFrame(SpriteImage image, long timer) {
totalDuration += timer;
frames.add(new AnimationFrame(image, totalDuration));
}
/**
* 添加一个动画图像
*
* @param image
* @param timer
*/
public synchronized void addFrame(Image image, long timer) {
addFrame(new SpriteImage(image), timer);
}
/**
* 添加一个动画图像
*
* @param fileName
* @param timer
*/
public synchronized void addFrame(String fileName, long timer) {
addFrame(new SpriteImage(fileName), timer);
}
/**
* 开始执行动画
*
*/
public synchronized void start() {
animTime = 0;
if (frames.size() > 0) {
currentFrameIndex = 0;
}
}
/**
* 更新当前动画
*
* @param timer
*/
public synchronized void update(long timer) {
if (isRunning) {
if (frames.size() > 0) {
animTime += timer;
if (animTime > totalDuration) {
animTime = animTime % totalDuration;
currentFrameIndex = 0;
}
while (animTime > getFrame(currentFrameIndex).endTimer) {
currentFrameIndex++;
}
}
}
}
/**
* 返回当前动画图象
*
* @return
*/
public SpriteImage getSpriteImage() {
if (frames.size() == 0) {
return sprImage;
} else {
if (alpha > 0) {
sprImage = getFrame(currentFrameIndex).image;
sprImage.setAlpha(alpha);
} else {
sprImage = getFrame(currentFrameIndex).image;
}
return sprImage;
}
}
/**
* 返回当前动画图象
*
* @param index
* @return
*/
public SpriteImage getSpriteImage(int index) {
if (index < 0 || index >= frames.size()) {
return sprImage;
} else {
if (alpha > 0) {
sprImage = getFrame(index).image;
sprImage.setAlpha(alpha);
} else {
sprImage = getFrame(index).image;
}
return sprImage;
}
}
/**
* 返回当前动画面板
*
* @param i
* @return
*/
private AnimationFrame getFrame(int index) {
if (index < 0) {
return (AnimationFrame) frames.get(0);
} else if (index >= frames.size()) {
return (AnimationFrame) frames.get(frames.size() - 1);
}
return (AnimationFrame) frames.get(index);
}
/**
* 设定停止状态
*
* @param isStop
*/
public void setRunning(boolean runing) {
this.isRunning = runing;
}
/**
* 返回动画状态
*
* @param isStop
*/
public boolean isRunning() {
return this.isRunning;
}
/**
* 返回当前动画索引
*
* @return
*/
public int getCurrentFrameIndex() {
return this.currentFrameIndex;
}
public float getAlpha() {
return alpha;
}
public void setAlpha(float alpha) {
this.alpha = alpha;
}
public void setCurrentFrameIndex(int index) {
this.currentFrameIndex = index;
}
public int getTotalFrames() {
return frames.size();
}
private class AnimationFrame {
SpriteImage image;
long endTimer;
public AnimationFrame(SpriteImage image, long endTimer) {
this.image = image;
this.endTimer = endTimer;
}
}
public void dispose() {
if (sprImage != null) {
sprImage.dispose();
sprImage = null;
}
}
}