如何屏蔽显示在背景 BufferedImage 之上的网格 BufferedImage
How to mask a grid BufferedImage displayed on top of a background BufferedImage
这里的第一个问题,在 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 :这就是问题所在。网格的重叠部分仍然 'printed' 在背景图像上,网格的其余部分显示 'under' 背景。
为什么会这样?我做错了什么 ?是由于来自 Graphics2D Class 的 optimization/render 吗?我应该使用分层窗格吗?
对于两个 BufferedImages,我使用:
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);
}
/*********************************************************************************************************/
如有任何帮助,我们将不胜感激。谢谢。
找到原因(虽然不是 'why ?')。
我第三次调用 'displayMap' 时使用的是空图像
//Display Elements
displayMap(g, mapElements);
由
创建
mapElements = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
我还没有在上面画画。
当我评论对 'displayMap(g, mapElements);' 的调用时,我终于有了想要的行为。
但我还是不知道为什么?我认为这是图形 Class 和 'drawn' 函数的编码方式:
This method returns immediately in all cases, even if the complete image has not yet been loaded, and it has not been dithered and converted for the current output device.
我猜 JVM 不知何故 'pools' (?) 同一区域的图纸和我的地图合并了...
如果有人能用简单的方式解释一下...
这里的第一个问题,在 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 :这就是问题所在。网格的重叠部分仍然 'printed' 在背景图像上,网格的其余部分显示 'under' 背景。
为什么会这样?我做错了什么 ?是由于来自 Graphics2D Class 的 optimization/render 吗?我应该使用分层窗格吗?
对于两个 BufferedImages,我使用:
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);
}
/*********************************************************************************************************/
如有任何帮助,我们将不胜感激。谢谢。
找到原因(虽然不是 'why ?')。 我第三次调用 'displayMap' 时使用的是空图像
//Display Elements
displayMap(g, mapElements);
由
创建mapElements = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
我还没有在上面画画。
当我评论对 'displayMap(g, mapElements);' 的调用时,我终于有了想要的行为。
但我还是不知道为什么?我认为这是图形 Class 和 'drawn' 函数的编码方式:
This method returns immediately in all cases, even if the complete image has not yet been loaded, and it has not been dithered and converted for the current output device.
我猜 JVM 不知何故 'pools' (?) 同一区域的图纸和我的地图合并了... 如果有人能用简单的方式解释一下...