从新屏幕大小重新计算X和Y坐标

时间:2016-05-11 01:01:13

标签: java swing resize awt graphics2d

我正在尝试从我拥有的数组中显示切片,以便在绘制时总是填充屏幕的大小。我现在忽略纵横比。

以下是我的代码的工作原理。我有tile对象传递给tileset(用于管理tile对象数组的类),然后我遍历tileset数组,返回每个tile对象id并根据所述id呈现我的tileset图像的子图像。 / p>

这是我的mapUpdate方法,在每个JFrame resize事件上调用:

public synchronized void mapUpdate(Screen screen) {
    factorX = (float)(screen.getWidth() / scW);
    factorY = (float)(screen.getHeight() / scH);

    for (int i = 0; i < tileset.getRows(); i++) {
        for (int j = 0; j < tileset.getCols(); j++) {
            int x = tileset.getTile(i, j).getX();
            int y = tileset.getTile(i, j).getY();
            tileset.getTile(i, j).setX((int)(x * factorX));
            tileset.getTile(i, j).setY((int)(y * factorY));
        }
    }

    mapTiles.clear();

    for (int i = 0; i * 70 < mapImage.getWidth(); i++) {
        mapTiles.add(mapImage.getSubimage(70 * i, 0, 70, 70).getScaledInstance(screen.getWidth() / 10, screen.getHeight() / 10, Image.SCALE_SMOOTH));
    }
}

mapTiles是一个图像的ArrayList,在每个resize事件中它重置arraylist,将我的子图像缩放到1/10宽度和高度,然后重新添加新大小的图像供我渲染渲染(tileset)图像只有3个原始大小为70x70的图块。

如果你很好奇,这里是componentResized方法:

public void componentResized(ComponentEvent e) {
    canvas.setSize(app.getContentPane().getWidth(), app.getContentPane().getHeight());
    if (level1 != null) {
        level1.mapUpdate(this);
    }
}

正如你在我的mapUpdate方法中看到的那样,我试图得到一个浮点数来乘以每个当前的x和y值,以接收新的正确值(它将围绕整数),但这根本不起作用。

是否有任何解决方案可以轻松地重新计算我的X和Y坐标,以便正确绘制图块?

2 个答案:

答案 0 :(得分:1)

你的factorX不应该是浮点数。它应该是一个int。如果你使用浮动,你将会变圆,所以偶尔你会因为四舍五入而在瓷砖之间有一个像素间隙。如果您只使用int,那么您不必担心这一点。然后该位置只是因子* for循环的索引值。

另一方面,最简单的解决方案是使用带有GridLayout的JPanel。然后,您可以添加带有图像图标的JLabel。 GridLayout将平均调整每个组件的大小。

您甚至可以使用Stretch Icon,并且会在调整帧大小时动态调整图像大小。

答案 1 :(得分:1)

解决方案由@MadProgrammer提供 - 解决方案是简单地计算新的X和Y&#34;起源&#34;对于每个瓷砖。我仍然需要根据新计算的原点实现调整已移动的切片的位置,但此解决方案适用于不移动的切片(再次,只需重新计算X和Y原点位置)。

public synchronized void mapUpdate(Screen screen) {
    int originX = screen.getWidth() / 10;
    int originY = screen.getHeight() / 10;

    for (int i = 0; i < tileset.getRows(); i++) {
        for (int j = 0; j < tileset.getCols(); j++) {
            tileset.getTile(i, j).setX((originX * j));
            tileset.getTile(i, j).setY((originY * i));
        }
    }

    mapTiles.clear();

    for (int i = 0; i * 70 < mapImage.getWidth(); i++) {
        mapTiles.add(mapImage.getSubimage(70 * i, 0, 70, 70).getScaledInstance(screen.getWidth() / 10, screen.getHeight() / 10, Image.SCALE_SMOOTH));
    }
}