java - 有效地将 BufferedImage 中的球形区域设置为一定的不透明度

标签 java bufferedimage isometric

首先,我在 Google 和 SO 中搜索了这个答案,只找到了如何将实际像素更改为某个 alpha 值,这会非常慢,或者实际上会成为 BufferedImage 的一部分。通过使用lwg2.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR))完全透明。这正是我需要的功能,但是,我需要该值小于 1f ,您无法对 AlphaComposite.CLEAR 的这个特定实例执行此操作.

我想要这个实现的目的是让我的 2.5d 游戏中的墙在玩家走到墙后面时变得透明,如下所示:example

我的游戏背后的逻辑是地形是一个BufferedImage仅在调用时更新,然后将其余的墙壁等绘制到另一个 BufferedImage 上其中还绘制了实体,因此不透明度变换只会影响树木(或墙壁)。

这是我正在使用 atm 的代码,但正如我所说,我不希望我正在绘制的圆圈使图像的一部分完全透明,但只是稍微透明(大约 50%):

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.5f));
g2.fillOval(x - (int) (TILE_WIDTH * 1), y - (int) (TILE_HEIGHT * 1.5), TILE_WIDTH * 2, TILE_HEIGHT * 3);

(0.5f 构造函数中的 AlphaComposite 不执行任何操作)。

我需要它保持高效的原因是因为我每秒更新此图像 30 次,所以效率 > 质量。

最佳答案

因此,我最终解决了这个问题,不是通过使图像的一部分变得半透明来直接操作图像,而是操纵我正在绘制的图像的不透明度。正如 @user343760 和 @NESPowerGlove 提到的,当玩家位于其后面时,我可以使我正在使用的资源变得半透明。由于我使用底层网格数组来支持我的游戏,因此我可以通过计算 tile.x - 1 == (int) player.xtile.y - 来实现此目的1==(int)player.y。在等距图中,这意味着在我们的视角中,玩家位于其正上方的图 block 上。然后我必须解决如果 wall.z 大于 0 或 1 的问题,因此会出现这样的问题:如果墙壁在瓷砖上方延伸 z = 5,则“下方”5 个方 block 的方 block 可能会阻碍玩家。针对这个问题,我实现了以下解决方案:

for(int i = 0; i < wall.getAsset(1f).getHeight()/TILE_HEIGHT; i++) {
    if((tile.x - i - wall.z == (int) world.player.getX() && tile.y - i -wall.z == (int) world.player.getY())) {
        lwg2.drawImage(wall.getAsset(0.5f), x, y, this);                                            
    }
}

这也确保了图像是透明的,即使玩家位于墙所在的图 block “上方”,就图像延伸到该限制之上而言。我已经通过使用 for 循环修复了这个问题,该循环在上面查找 i 次,具体取决于 image.height/tile_height(这是一个通用常量)。

如果您需要使图像的一部分透明,除了操作 BufferedImage 低层中的像素之外,我还没有找到可以正常工作的解决方案。如果您还想直接删除图像的一部分,请使用代码 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR)); 并像平常一样进行绘制。请记住通过 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); 切换回普通复合 Material 。

您还可以首先使用 Composite g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity)); 进行绘制,其中opacity 是一个 float,其值从 0f1f0f 完全透明1f 完全不透明。

我希望这对任何人都有帮助。如果您找到更好的方法,请为 future 的读者留下评论。

这就是我的解决方案:):

working example

关于java - 有效地将 BufferedImage 中的球形区域设置为一定的不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31186203/

相关文章:

java - 将灰度值从 .csv 转换为 BufferedImage

java - 更新 JFrame 中的 BufferedImage

java - 显示 BufferedImage 后如何对其进行编辑?

3d - 在等距瓷砖游戏中实现和设计墙壁的最佳方法是什么?

vb.net - 在等轴测引擎中剔除屏幕外图 block

java - cygwin + java = 无法杀死的 java 进程,然后出现 BSOD(蓝屏死机)

java - 如何检查电子邮件是否确实存在

java - 在 Tomcat 上部署 Java Play 应用程序?

java - 通过 JMS 发送的 XML 消息 (JAXB) 为空

html - CSS Transforms 给 div 一个轮廓