项目源码
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);