【发布时间】:2020-06-17 22:50:03
【问题描述】:
这里的第一个问题,Java 很新(英语不是我的母语),请放纵 :) 没有发现任何类似的问题。
我正在尝试制作 2D 游戏(轮流进行,所以没有实时问题)。我的地图显示在 JPanel 中,其中混合了背景、网格和可移动对象的图像。 所有图像在显示之前都会加载和存储一次。我有一个 BufferedImage 用于背景,另一个用于绘制网格,还有许多用于其他对象的图像。 在 paintComponent() 中,我在 Graphics2D 上绘制所有 BufferedImage(从 Graphics 参数转换)。 我的问题是当玩家选择时(或者当比例太大时,分别使用变量“ruleGrid”和“zoom”)来掩盖网格。测试文本输出已正确记录,但网格仍然可见。 两张图片似乎已合并,我无法掩盖第二张图片。 我试图在其他地方(其他坐标)显示网格并且效果很好。但是,如果两个图像重叠,则另一个图像上的网格部分会保留(就像在第一个图像上绘制,而不是在 JPanel 上绘制)。 如果不够清楚,请见谅...
一些屏幕截图可能会有所帮助: Grid and background with same coordinates
Grid and background with different coordinates
When scrolling and zooming out :这就是问题所在。网格的重叠部分仍然“打印”在背景图像上,网格的其余部分显示在背景“下方”。
为什么会这样?我做错了什么 ?是由于 Graphics2D 类的优化/渲染吗?我应该使用分层窗格吗?
对于这两个 BufferedImage,我使用:
BufferedImage.TYPE_INT_ARGB
.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
这是我的代码的简化:
BufferedImage mapZones;
BufferedImage mapGrid;
@Override
public void paintComponent(Graphics g1){
Graphics2D g = (Graphics2D)g1;
//Clear the map
clearBackground(g);
//Display Background
displayMap(g, mapZones);
//Grid
if (Options.ruleGrid && Options.zoom > 4f) {
displayMap(g, mapGrid);
System.out.println("Test if grid should be displayed");
}
}
/*********************************************************************************************************/
private void displayMap(Graphics2D g, BufferedImage bufI) {
g.drawImage(bufI, -x0, -y0, width, height, null);
}
/*********************************************************************************************************/
private void clearBackground(Graphics2D g1) {
g1.setColor(Color.WHITE);
int max = 500000;
g1.clearRect(-max, -max, max*2, max*2);
}
/*********************************************************************************************************/
任何帮助将不胜感激。谢谢。
【问题讨论】:
标签: merge bufferedimage graphics2d overlapping