手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)
  97wjiurZkMpk 2023年11月02日 47 0

项目源码

​项目源码​

坐标变换

package sprite;

import java.awt.geom.AffineTransform;


public class Transform {
private double _x;
private double _y;

private AffineTransform _at;
private AffineTransform _rat;

private double _cx;
private double _cy;

public Transform(){
_rat = new AffineTransform();
_x = 0;
_y = 0;
}


public void translate(double x,double y){
_at = new AffineTransform();
_at.translate(_cx,_cy);
_at.translate(x, y);
_at.translate(-_cx,-_cy);
_rat.preConcatenate(_at);
_x += x;
_y += y;
}


public void scale(double xscl,double yscl){
_rat.translate(_cx,_cy);
_rat.scale(xscl,yscl);
_rat.translate(-_cx,-_cy);
}


public double getX(){
return _x+_cx;
}


public double getY(){
return _y+_cy;
}

public AffineTransform getTransform(){
return _rat;
}

public void setOrigin(int x, int y){
_cx = x;
_cy = y;
}

}

该类利用java的仿射变换类AffineTransform,实现sprite的平移与缩放操作。该类通常的用法如下: 先调用setOrigin方法,锚定到图像的中心点。 对于图像的平移操作translate:

  1. 先移动到中心点(_at.translate(_cx,_cy));
  2. 平移到指定点(_at.translate(x, y));
  3. 返回到初始点(_at.translate(-_cx,-_cy))
  4. 因为我们有时需要连续的平移操作(比如sprite连续的向右平移),所以应该将这些操作连接在一起(_rat.preConcatenate(_at);)。

对于图像的缩放操作:

  1. 先移动到中心点(_rat.translate(_cx,_cy));
  2. 缩放(_rat.scale(xscl,yscl));
  3. 返回到初始点(_rat.translate(-_cx,-_cy))

Sprite

Sprite.java

package sprite;

import java.awt.*;

public class Sprite extends Transform{

private Image _img;


public Sprite(String path){
super();
_img = new Image(path);
setOrigin(_img.getWidth()/2,_img.getHeight()/2);
translate(0, 0);
}


public void show(Graphics2D g){
g.drawImage(_img.getImage(), getTransform(), null);
}


public Image getImage(){
return _img;
}

}

Sprite继承Transform,内部持有一个Image对象。 Sprite构造函数中,加载图像,设置锚定点到图像的中心点,并且将自身平移到屏幕的左上角。

测试一下

修改GameApp.java如下:

手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)_项目源码

sprite = new Sprite("res/dog/01.png");
sprite.scale(2,2);
sprite.translate(200,100);
sprite.translate(100,100);

可以看到图像放大了2倍,并且向右平移了300像素,向下平移了200像素 我们可以暂时注释掉Image的makeTransparent方法调用,这样可以更清晰的看出来图像的平移和缩放。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

97wjiurZkMpk