用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,相比较GraphicsGraphics2D扩展了对几何形状、坐标转换、颜色管理和文本布局等更为复杂的控制。这样以后的一些图片处理就方便了。

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.
  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值