我正在尝试从我拥有的数组中显示切片,以便在绘制时总是填充屏幕的大小。我现在忽略纵横比。
以下是我的代码的工作原理。我有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坐标,以便正确绘制图块?
答案 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));
}
}