在不触摸的情况下绘制变暗的缓冲图像

draw darkened bufferedimage without touching it

我目前正在制作一款基于图块的策略游戏,它的地图由一堆精灵 (BufferedImages) 组成,由 java.awt.Graphics.drawimage(..)

绘制

我想要的是如果玩家离它们太远,能够将这些精灵画得更暗。 我见过很多类似的问题,但没有找到我想要的。有没有办法在不触及原始精灵的情况下做到这一点?也许其他一些绘图功能?还是我绝对需要复制每个精灵?可悲的是,那会使我的游戏变得一团糟...

您可以在绘制图像时使用Graphics2D.drawImage(BufferedImage image, BufferedImageOp op, int x, int y) and a RescaleOp改变颜色:

g2.drawImage(image, new RescaleOp(
        new float[]{0.5f, 0.5f, 0.5f, 1f}, // scale factors for red, green, blue, alpha
        new float[]{0, 0, 0, 0}, // offsets for red, green, blue, alpha
        null), // You can supply RenderingHints here if you want to
    0, 0);

请注意,您需要多少比例尺 factors/offsets 以及它们在哪个波段上运行取决于您的图像类型,以上内容会使 ARGB 类型的 BufferedImage 变暗,但可能会产生其他结果不同类型的图像(如果图像没有 4 个波段则抛出异常)。