项目源码
sprite动画
上一节,我们可以控制sprite移动了,但sprite的移动就是平移,比较呆板;这一节我们给sprite添加动画效果。
Animation类继承Transform,这样就具备了平移和缩放的能力。
主要思想是:
1.包含一个图片的列表(动画的本质就是多张图片的连续播放)
2.内部有个定时器,不断更换图片。
@Override
public void actionPerformed(ActionEvent e) {
_currentFrame++;
if(_currentFrame>_maxFrame){
_currentFrame = 0;
}
}
Animation类完整代码:
private ArrayList<Image> _images;
package sprite;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class Animation extends Transform implements ActionListener {
private ArrayList<Image> _images;
private int _frames;
private int _currentFrame = 0;
private int _maxFrame = 0;
private Timer _tm;
public Animation(ArrayList<Image> images){
super();
_images = images;
_frames = images.size();
_maxFrame = images.size() - 1;
_tm = new Timer(50,this);
_tm.start();
translate(0, 0);
}
public int getFrameCount(){
return _frames;
}
public ArrayList<Image> getImages(){
return _images;
}
@Override
public void actionPerformed(ActionEvent e) {
_currentFrame++;
if(_currentFrame>_maxFrame){
_currentFrame = 0;
}
}
public void show(Graphics2D g){
Image img = _images.get(_currentFrame);
g.drawImage(img.getImage(),getTransform(),null);
}
}
GameApp加载动画
GameApp.java 的变化
1.定义一个动画对象
private Animation hound;
2.构建一个图片列表,并用其初始化动画对象hound
ArrayList<Image> images = new ArrayList<Image>();
for(int k = 10; k < 16; k++){
Image img = new Image("res/dog/" + k + ".png");
images.add(img);
}
hound = new Animation(images);
3.在每次游戏循环中,调用动画对象的show方法,显示当前动画帧。
hound.show(g);