接下来继续说动画的制作。
我拿QQ的截图随便截了悠嘻猴里的一个小猴子的3个帧的动作,将他们循环播放来模拟一个动画。但图像截的很烂,谁能给提供个素材先谢谢了。
动画的原理:
其实就是一系列的图在迅速的东。动画中的图像叫帧,frame,每一帧有自己显示的时间,不一定相同,有的显示300毫秒,有的可能是100毫秒。
我们用Animation这么一个类来描述动画。
首先建立一个模拟每一帧动画的类AnimationFrame
测试:
我拿QQ的截图随便截了悠嘻猴里的一个小猴子的3个帧的动作,将他们循环播放来模拟一个动画。但图像截的很烂,谁能给提供个素材先谢谢了。
动画的原理:
其实就是一系列的图在迅速的东。动画中的图像叫帧,frame,每一帧有自己显示的时间,不一定相同,有的显示300毫秒,有的可能是100毫秒。
我们用Animation这么一个类来描述动画。
首先建立一个模拟每一帧动画的类AnimationFrame
package com.jsheng.game.util;
import java.awt.Image;
/** function:
* company: jsheng
* @author wanghn wanghaining9999@sina.com
*/
public class AnimationFrame {
Image image;
long endTime;
public AnimationFrame(Image image, long endTime) {
this.image = image;
this.endTime = endTime;
}
}
package com.jsheng.game.util;
import java.awt.Image;
import java.util.ArrayList;
public class Animation {
private ArrayList<AnimationFrame> frames; //帧
private int currentFrameIndex; //当前帧
private long animationTime; //时间
private long total; //总时间
public Animation() {
frames = new ArrayList<AnimationFrame>();
total = 0;
}
public void addFrame(Image image,
long time){
total += time;
frames.add(new AnimationFrame(image, total));
}
public void update(long passedTime) {
if (frames.size() > 1) {
animationTime += passedTime;
if (animationTime >= total) {
animationTime = animationTime % total;
currentFrameIndex = 0;
}
while (animationTime > getFrame(currentFrameIndex).endTime) {
currentFrameIndex++;
}
}
}
public Image getImage() {
if (frames.size() == 0) {
return null;
}
else {
return getFrame(currentFrameIndex).image;
}
}
private AnimationFrame getFrame(int i) {
return frames.get(i);
}
}
测试:
测试:
package com.jsheng.game.test1;
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import com.jsheng.game.util.Animation;
import com.jsheng.game.util.MyScreenMgr;
/** function:
* company: jsheng
* @author wanghn wanghaining9999@sina.com
*/
public class FullScreenTest3 extends JFrame {
private static final long serialVersionUID = 1L;
private Image bgImage;
private Image myImage;
private Image myImage2;
private boolean flag;
private MyScreenMgr screen;
private Animation anim;
public static void main(String[] args) {
DisplayMode displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
FullScreenTest3 test = new FullScreenTest3();
test.run(displayMode);
}
public void loadImages() {
bgImage = loadImage("images/bg.jpg");
Image p1 = loadImage("images/1.jpg");
Image p2 = loadImage("images/2.jpg");
Image p3 = loadImage("images/3.jpg");
anim = new Animation();
anim.addFrame(p1, 150);
anim.addFrame(p2, 250);
anim.addFrame(p1, 150);
anim.addFrame(p2, 150);
anim.addFrame(p3, 200);
anim.addFrame(p2, 150);
flag = true;
}
private Image loadImage(String fileName) {
return new ImageIcon(fileName).getImage();
}
//动画循环
public void animationLoop() {
long startTime = System.currentTimeMillis();
long currTime = startTime;
while (currTime - startTime < 4000) {
long nowTime = System.currentTimeMillis();
long elapsedTime = nowTime - currTime;
currTime += elapsedTime;
anim.update(elapsedTime);
Graphics g =
screen.getFullScreenWindow().getGraphics();
draw(g);
g.dispose();
try {
Thread.sleep(20);
}
catch (InterruptedException ex) { }
}
}
public void run(DisplayMode displayMode) {
screen = new MyScreenMgr();
try {
screen.setFullScreen(displayMode, new JFrame());
loadImages();
animationLoop();
}
finally {
screen.reScreen();
}
}
//将方法提取出来
public void draw(Graphics g) {
if (flag) {
g.drawImage(bgImage, 0, 0, null);
g.drawImage(anim.getImage(), 0, 0, null);
}
else {
g.drawString("正在读取图片", 5, 24);
}
}
}