Merge 如何屏蔽显示在背景BuffereImage顶部的网格BuffereImage

Merge 如何屏蔽显示在背景BuffereImage顶部的网格BuffereImage,merge,bufferedimage,graphics2d,overlapping,Merge,Bufferedimage,Graphics2d,Overlapping,这里的第一个问题,在java(英语不是我的母语)是很新的,请原谅:) 没有发现任何类似的问题 我正在尝试制作一个2D游戏(逐轮,所以没有实时问题)。我的地图显示在JPanel中,混合了背景、栅格和可移动对象的图像。 所有图像在显示前加载并存储一次。我有一个用于背景的BuffereImage,另一个用于绘制网格,还有许多用于其他对象的图像。 在paintComponent()中,我在Graphics2D上绘制所有BuffereImage(从Graphics参数转换)。 我的问题是当玩家选择屏蔽网格

这里的第一个问题,在java(英语不是我的母语)是很新的,请原谅:) 没有发现任何类似的问题

我正在尝试制作一个2D游戏(逐轮,所以没有实时问题)。我的地图显示在JPanel中,混合了背景、栅格和可移动对象的图像。 所有图像在显示前加载并存储一次。我有一个用于背景的BuffereImage,另一个用于绘制网格,还有许多用于其他对象的图像。 在paintComponent()中,我在Graphics2D上绘制所有BuffereImage(从Graphics参数转换)。 我的问题是当玩家选择屏蔽网格时(或者当比例太大时,分别使用变量“ruleGrid”和“zoom”)屏蔽网格。测试文本输出已正确记录,但网格仍然可见。 两张图片似乎都合并了,我无法掩盖第二张。 我尝试在其他地方(其他坐标)显示栅格,效果很好。但如果两个图像重叠,则另一个图像上的网格部分保持不变(就像在第一个图像上绘制一样,而不是在JPanel上绘制一样)。 对不起,如果不够清楚

一些屏幕截图可能会有所帮助:

当前位置问题出在这里。网格的重叠部分仍然“打印”在背景图像上,其余网格显示在背景下

为什么会这样?我做错了什么?这是由于Graphics2D类的优化/渲染造成的吗?我应该使用分层窗格吗?

对于两个BuffereImage,我都使用:

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);
}
/*********************************************************************************************************/
任何帮助都将不胜感激。谢谢。

找到原因(但不是“为什么”)。 我第三次打电话给“displayMap”,电话中有一张空图像

    //Display Elements
    displayMap(g, mapElements);
它是由

mapElements = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
我还没有把它画出来

当我对“displayMap(g,mapElements);”的调用进行注释时,我终于有了想要的行为

但我还是不知道为什么?我认为这是图形类和“绘制”函数的编码方式:

此方法在所有情况下都会立即返回,即使尚未加载完整图像,并且尚未对当前输出设备进行抖动和转换

我猜JVM以某种方式“池”(?)相同区域中的图形和我的地图被合并。。。 如果有人能用一种简单的方式解释这一点