-2

目前,我正在尝试制作一个面板来管理我正在编写的游戏中的剪辑。当玩家点击鼠标时,它会高亮显示在屏幕右侧的剪辑,如果玩家在键盘上按下 H,它会在屏幕上显示一些帮助玩家的子弹。当我画这些帮助字符串时,我画了一个灰色的大方块,然后在上面画了黑色的文本。当我尝试清除它时(通过将图像重置为我的源文件中的空白图像),所有新的东西都被绘制在帮助屏幕的顶部,而不是帮助屏幕被清除。

public void refresh(){
        overImg = World.imageBank.getImage("blank", -1).getSubimage(0, 0, 400, 400);
    drawInfo();
        drawClips();
        drawLayers();
        repaint();
    }

imageBank 正是它听起来的样子,在初始化世界时绘制的一组图像。getImage("blank", -1) 返回我制作的具有空白 Alpha 通道的 1200、1200 图像,并且我使用它的较小版本。每次按下任何东西时都会调用此刷新方法,我无法理解为什么不重置图像。如果我应该提供任何其他代码,这可能是我的问题,请告诉我。

4

1 回答 1

1

对于遇到同样问题的其他人,我的朋友向我展示了解决方案。当我从图像库中提取图像时,它并没有制作新图像(这应该很明显),它只是提供对原始子图像部分的引用,这只是意味着我正在绘制缓冲的空白图像存储在图像库中。为了防止这种情况,应该做的是制作图像的深层副本,这需要(或多或少)像这样完成。

public static BufferedImage deepCopyImage(BufferedImage bF){
        ColorModel cm = bF.getColorModel();
        boolean alphaPre = bF.isAlphaPremultiplied();
        WritableRaster wR = bF.copyData(null);
        return new BufferedImage(cm, wR, alphaPre, null);
    }
于 2013-05-03T13:39:13.147 回答