【问题标题】:How to mask a grid BufferedImage displayed on top of a background BufferedImage如何屏蔽显示在背景 BufferedImage 顶部的网格 BufferedImage
【发布时间】: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


    【解决方案1】:

    找出原因(但不是“为什么?”)。 我第三次使用空图像调用“displayMap”

        //Display Elements
        displayMap(g, mapElements);
    

    创建
    mapElements = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    

    我还没有画到它。

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

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

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

    我猜 JVM 会以某种方式“汇集”(?)同一区域中的图纸和我的地图被合并... 如果有人能用简单的方式解释这个......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多