用Java实现游戏角色的动画播放
前言
前段时间做课设,小组决定做一个小游戏,中间的细枝末节就不在这里说了,其中一个任务就是设计一个依附于游戏角色的类——动图绘制类。
动图绘制类Animation
基本思想
根据组长的类图设计,游戏角色的绘制由Animation类负责。
初始化游戏角色的时候让角色的Animation类通过loadImage()
方法加载该角色的动图图片集合,当需要绘制的时候,就利用getNextFrame()
一张一张取出来,通过drawNextFrame()
方法绘制到面板上
实现
加载图片loadImage()
首先准备一组图片,图片我默认放在根目录下,这样写路径的时候就方便一些,人物用的是《明日方舟》的炎客(暴露了自己是一名刀塔客哈哈哈)
加载代码如下,我使用的是ImageIcon
,这里面的路径的读取方式和图片的存储格式也可以根据自己需要修改。
/**
* 加载图片集合
* @param path 图片集的文件夹路径+‘/’
* @param num 图片个数
*/
public void loadImages(String path,int num) {
String index = "";
//循环把图片读进集合
for(int i=1;i<num;i++) {
if(i<10) {
index = "0"+i;}
else {
index = String.valueOf(i);}
ImageIcon icon = new ImageIcon(path+index+".png");
m_images.add(icon.getImage());
}
}
获取下一帧getNextFrame()
这个就无需多言啦,只需要每次把图片集合的索引m_curFrameIndex
+1,然后返回图片即可。
public Image getNextFrame() {
//索引+1(注意集合的范围)
m_curFrameIndex = (m_curFrameIndex +1)%m_images.size();
return (Image)m_images.elementAt(m_curFrameIndex);
}
绘制动图drawNextFrame()
首先得到集合里要绘制的图片,然后再获取绘制面板和画图设备,这里使用的是Graphics2D
,相比较Graphics
,Graphics2D
扩展了对几何形状、坐标转换、颜色管理和文本布局等更为复杂的控制。这样以后的一些图片处理就方便了。
public void drawNextFrame(Graphics g,int x,int y,JFrame panel) {
//得到需要绘制的图片
Image img = this.getNextFrame();
//得到面板和画图设备
buffer = panel.createImage(panel.getWidth(),panel.getHeight());
m_og = (Graphics2D) buffer.getGraphics();
//双缓冲绘制图片
if(img != null) {
m_og.drawImage(img,x,y,panel);
g.drawImage(buffer,0,0,null);
}
}
绘制镜面动图drawFilpFrame()
我之前查阅的一些资料中,游戏角色同时拥有各个方向的图片,当发生转向时直接绘制相应方向的图片。
不过在Animation这里,尝试只用一套图片来绘制左右方向——反方向的绘制通过对图片进行对称变换来实现。
这时候Graphics2D
的用处就来了!
因为Graphics2D
包含一个AffineTransform
类,它类似于一个变换矩阵,可以使用一系列平移 (translation)、缩放 (scale)、翻转 (flip)、旋转 (rotation) 和错切 (shear) 来构造 仿射变换。
关于AffineTransform的使用我是参考这个博客:
Java中利用AffineTransform中的scale函数对图像进行对称变换
所以,需要绘制反向时,对图片进行一次对称变换即可。
//矩阵
AffineTransform trans = new AffineTransform();
//根据y轴对称
trans.scale(-1, 1);
//因为是针对整个面板对称所以要平移回去
trans.translate(-(2*x+img.getWidth(null)), 0