【问题标题】:Drawing a part of an image (Java)绘制图像的一部分(Java)
【发布时间】:2020-08-23 02:28:28
【问题描述】:

这是我的问题 - 我正在尝试绘制单个图像的圆形部分。

我正在开发一种自上而下的地牢爬行类游戏,并试图在玩家周围形成一个光半径。地板是一个单一的图像,我只需要绘制它的一小部分圆形部分。我一直在研究这个方法:

drawImage(Image img,
          int dx1, 
          int dy1,
          int dx2,
          int dy2,
          int sx1,
          int sy1,
          int sx2,
          int sy2,
          Color bgcolor, 
          ImageObserver observer) 

但是,看起来它只会绘制一个正方形的小节。 有没有人碰巧知道比绘制大量小方块来产生圆形错觉更简单的方法?

谢谢

【问题讨论】:

  • 为什么不直接覆盖黑色图像,中间有透明部分? i.imgur.com/eOmFF.png
  • 有关如何生成此类图像的代码,请查看我的答案。

标签: java graphics


【解决方案1】:

您可以使用Graphics 中的setClip() 方法来做到这一点。

它需要一些其他的工作,但是:

import java.awt.Graphics;
import java.awt.geom.QuadCurve2D;
//...

  g.setClip(new QuadCurve()); // Set the bounding curve for the image.
  g.drawImage(...);

正如我所说,它需要更多的工作,这意味着 QuadCurve2D 对象可能需要以不同的方式定义,但您可以 check the doc 这样做。

【讨论】:

  • 我会调查的。非常感谢。你认为我可以用 Ellipse2D 代替 QuadCurve 吗?
  • 我不确定,我并没有真正深入研究它。如果Ellipse2D 实现Shape 那么它将起作用。
  • 好吧,我会去玩一两个小时。谢谢!
  • 其实,等等。我看到的所有 drawImage() 都需要 x,y 位置,这对我来说意味着一个正方形。我究竟如何将 setClip 信息放入 drawImage?对不起,如果这看起来很厚,但我没有看到来自 setClip 的任何有用的返回信息。
  • 或者复制一个 Graphics 对象,将剪辑应用到它,然后在完成后将 Graphic 丢弃。
【解决方案2】:

光半径最简洁的效果是在其 Alpha 通道中使用带有渐变的叠加层。

类似这样的:

// do this once during setup
overlay = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGBA);
for (int x = 0; x < width; ++x)
{
    for (int y = 0; y < height; ++y)
    {
        double range = 100;
        double distance = Math.sqrt(Math.pow(x - width / 2, 2) + Math.pow(y - height / 2, 2));
        int value = Math.max(100, (int)Math.round(255 - 100 * distance / range));
        overlay.setRGB(x, y, new Color(0, 0, 0, value));
    }
}
....
// do this every frame
gfx.drawImage(overlay, 0, 0, null);

我没有编译这个,所以它可能充满了错误!

如果你想要一些“闪烁”,你可以生成多个贴图,并为 alpha 值添加一些噪声。甚至可以调整颜色以获得更暖的光线。

【讨论】:

    【解决方案3】:

    这不是一个很好的解决方案,但是如果你画了整个地板,然后是一个中间有一个透明孔的黑色图像呢?

    【讨论】:

    • 我一直在考虑这个问题,但如果可能的话,我想找到另一种方法。另外,除非我只是在 Photoshop 中制作了该图像,否则它仍然会给我留下圆孔问题。我想用 Java 做,最好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2014-08-02
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多