当前位置: 首页 > 知识库问答 >
问题:

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

聂昱
2023-03-14

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

我正在尝试制作一个2D游戏(轮流,所以没有实时问题)。我的地图显示在JPanel中,混合了背景、网格和可移动对象的图像。所有图像在显示之前加载并存储一次。我有一个用于背景的BuffereImage,另一个用于绘制网格,还有许多其他对象的图像。在paintComponent()中,我在Graphics2D上绘制所有BufferedImages(从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);
}
/*********************************************************************************************************/

任何帮助都将不胜感激。谢谢。

共有1个答案

印劲
2023-03-14

找到原因(不过,不是“为什么?”)。我第三次调用带有空图像的“displayMap”

    //Display Elements
    displayMap(g, mapElements);

由创建

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

我还没有把它画出来。

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

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

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

我猜JVM某种程度上是“池”(?)同一地区的图画和我的地图被合并了……如果有人能用一种简单的方式来解释的话。。。

 类似资料:
  • 我的Android应用程序需要显示一个全屏位图作为背景,然后在上面使用OpenGL ES显示一些动态的3D图形(1.1或2.0--尚未决定)。背景图像是同一个应用程序中WebView组件的快照,因此它的尺寸已经完全适合屏幕。 我是OpenGL新手,但我知道显示位图的常规方法包括将其缩放成一个POT纹理(glTexImage2D)、配置矩阵、为矩形创建一些顶点并使用GLDraWarrays来显示。似

  • 问题内容: 为什么我的JComponent没有显示在背景JFrame的顶部? 请检查以下代码: 问题答案: 似乎在这里可以正常工作(在此SSCCE变种的代码中)。 工作代码 我可以从中得出的唯一结论是: 找不到您的资源。 您需要学习基本的调试技巧。在这种情况下,具体来说是“检查每个步骤中正在发生的假设是否确实有效”。如下所示的“三级”语句应分解为3个语句,同时使用System.out.printl

  •  背景,就是衬在文字和前景后面显示的东西。KAG 中(默认设定)的是读入 640×480 大小的背景图片。  首先,将想要显示的 640×480 的图片放进 bgimage 文件夹中。把图片命名为 bg0.jpg 。KAG 的 LZH 档里并没有包含背景图片,请自己准备一张吧(^^)  接着,把在 显示文字相关 里所使用的剧本档(first.ks)内容修改成以下这样。 [imagestorage=

  • 我正在做一个SWT项目,但是我将广泛使用来生成BufferedImages。我将以这种方式生成数十万张图像。 问题是,SWT似乎无法显示BuffereImage,并且有自己的类。我知道可以将BuffereImage转换为SWT的映像,但SWT的映像似乎需要手动处理,并且不像Swing的BuffereImage那样具有自动垃圾收集功能。 另外,我认为计算机要不断地从BuffereImage转换为Im

  • 问题内容: 如何在HTML顶部重复此1px x 1px CSS背景图像? 我在[其他包含的元素之上遇到了CSSshowdiv背景图片,但是似乎需要额外的div。理想情况下,我希望我根本不必使用div,但是根据HTMLimg上的[CSS背景图像这实际上是不可能的,至少对于100%宽度响应的场景而言并非如此。 问题答案: 您可以使用伪元素。在此示例中,伪元素 相 对于父元素绝对定位。它采用整个父元素的

  • 本文向大家介绍如何在HTML中显示元素的背景色?,包括了如何在HTML中显示元素的背景色?的使用技巧和注意事项,需要的朋友参考一下 在HTML中使用 bgcolor属性显示元素的背景色。它用于控制HTML元素的背景,特别是页面正文和表格背景。 注意-HTML5不支持此属性。 示例 您可以尝试运行以下代码以了解如何在HTML中实现bgcolor属性-