【问题标题】:2D visibility with java grapics (Fog of War)使用 java grapics 的 2D 可见性(战争迷雾)
【发布时间】:2015-07-28 18:59:21
【问题描述】:

我正在制作 2d 游戏,我想制作 2d 可见性。所以我的想法是制作地图,然后用另一个黑色(例如)多边形遮盖它,以便玩家可以透过黑色多边形看到地图。所以我的想法是通过黑色多边形绘制某种孔(多边形),以便查看黑色多边形下方的地图。我已经有了知名度,但我不知道如何制作面具。

这是程序到目前为止的样子http://prntscr.com/7y36ev

但问题是,如果有任何物体在黑暗中,它们仍然会被渲染并且玩家可以看到它们。我可以射出一条射线,看看它们是否在视线内,但这会有点麻烦,因为射线将在物体的中心拍摄,例如,如果只有它们的肩膀出现,物体就不会被渲染。有人可以帮忙吗?

编辑 - 对于任何想要做同样事情的人 我用 Path2D 做的。首先,我使用 Path2D 制作外部多边形,然后制作内部多边形(孔)并将孔附加到外部多边形。这是示例代码:

public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.red);

        Path2D.Double poly = new Path2D.Double();
        Path2D.Double hole = new Path2D.Double();

        hole.moveTo(40,40);
        hole.lineTo(40,60);
        hole.lineTo(60,60);
        hole.lineTo(60,40);
        hole.lineTo(40,40);

        poly.moveTo(80,2);
        poly.lineTo(80,80);
        poly.lineTo(2,80);
        poly.lineTo(2,2);
        poly.lineTo(80,2);

        poly.append(hole, true);
        g2d.fill(poly);  
    }

【问题讨论】:

    标签: java graphics polygon polygons


    【解决方案1】:

    您好,到目前为止,我了解您的问题,您是否打算在蒙版在同一位置有黑色像素时让地图的每个像素可见? 如果我是对的:

    获取 Map 的 BufferedImage 和 Mask 的 BufferedImage 并使用两个 for 循环,检查 Mask 在位置 (X,Y) 是否有黑色像素,如果是,则将 Map 的像素添加到新的 BufferedImage 到位置 (X ,Y) 否则将黑色像素添加到位置 (X,Y) 的结果 BufferedImage。

    编辑: 一点点伪代码

    BufferedImage mapBI = .... // the map as BufferedImage
    BufferedImage maskBI = .... // the mask as BufferedImage
    BufferedImage resultBI = ... // new BufferedImage with same size as mask 
    
    for (i=0; i< maskBI.width; i++){
        for(j=0; j< maskBI.height; j++){
            if (maskBI.pixelAt(i,j) == blackPixel){
                resultBI.setPixel(i,j,mapBI.pixelAt(i,j));
            }else{
                resultBI.setPixel(i,j,blackPixel);
            }
        }
    }
    

    我希望你明白我的意思。

    【讨论】:

    • 嗯,这是个好主意,但我正在使用 Graphics2D 进行绘图,但我不知道如何仅使用 Graphics 编辑像素。我正在使用与ncase.me/sight-and-light 相同的算法。你知道如何在不编辑每个像素的情况下制作它吗?
    • 您可以将 Graphics2D 转换为 BuffredImage 以访问每个像素:请阅读here
    • 是的,但这不会很慢,因为如果我有一个很大的分辨率,它会减慢很多。如果我在蒙版中制作一个整体,然后先绘制地图,然后再绘制蒙版,我就不必穿过每个像素,如果可能的话
    • 这是可能的,但是您必须知道在哪里绘制孔并且该信息仅存储在掩码中。另一种选择是定义一个蒙版对象,其中包含有关要绘制 not 的圆形或矩形的信息,然后在该蒙版对象的边缘绘制一个多边形。圆会有点难,但矩形应该很容易解决。
    • 是的,我可能会尝试这两种方法。感谢您的帮助和快速答复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多