使用java grapics(战争迷雾)的2D可见性

时间:2015-07-28 18:59:22

标签: java graphics polygon polygons

我正在进行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);  
    }

2 个答案:

答案 0 :(得分:0)

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

获取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);
        }
    }
}

我希望你理解我的意思。

答案 1 :(得分:0)

我有一个带有实际“雾”的游戏实现。 enter image description here

算法很简单。

    Rectangle b = this.getVisibleRect();
    double[] c = Main.player.getCenterPos();
    for(int x = b.x; x < b.width; x+=10) {
        for(int y = b.y; y < b.height; y+=10) {
            double d = MovementUtil.distanceTo(c[0], c[1], x, y);

            if(d < 500) {
                int alpha = (int)(250*d)/500;
                g2.setColor(new Color(200, 200, 200, alpha));
                g2.fillRect(x, y, 10, 10);
            } else if (d >= 500){
                g2.setColor(new Color(200, 200, 200, 250));
                g2.fillRect(x, y, 10, 10);
            }
        }
    }

MovementUtil.distanceTo()仅计算pythagores。我所做的就是从“查看距离”标准化alpha颜色。在这种情况下,就是500像素。

值得注意的是,除非您希望<1 FPS,否则您无法在此实现中扫描每个像素。但是,从图像中可以看到,使用10个像素并填充10个像素的矩形,雾看起来真的很干净,FPS仍然是60。