java 游戏编程 (二)

接下来继续说动画的制作。
我拿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);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值