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

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

项目源码


项目源码


坐标变换

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如下:



image.png


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


可以看到图像放大了2倍,并且向右平移了300像素,向下平移了200像素

我们可以暂时注释掉Image的makeTransparent方法调用,这样可以更清晰的看出来图像的平移和缩放。

目录
相关文章
|
8天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
21 0
java基础(13)String类
|
6天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
20 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
7天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
20 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
7天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
7天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
2天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
6天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
8天前
|
Java
java的class类
java的class类
18 5
|
IDE 小程序 前端开发
详细解读java的俄罗斯方块游戏的源代码--【课程设计】
详细解读java的俄罗斯方块游戏的源代码--【课程设计】
|
Java 定位技术 开发者
基于Java的俄罗斯方块游戏
基于Java的俄罗斯方块游戏
基于Java的俄罗斯方块游戏
下一篇
无影云桌面