Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java图形的2D可见性(战争迷雾)_Java_Graphics_Polygon_Polygons - Fatal编程技术网

java图形的2D可见性(战争迷雾)

java图形的2D可见性(战争迷雾),java,graphics,polygon,polygons,Java,Graphics,Polygon,Polygons,我正在制作一个2d游戏,我想制作2d可见性。因此,我的想法是制作地图,然后用另一个黑色(例如)多边形遮罩它,以便玩家可以通过地图上的黑色多边形看到它。所以我的想法是通过黑色多边形画一个洞(多边形),以便看到黑色多边形下方的地图。我已经做了可见性,但我不知道如何制作面具 到目前为止,这就是该计划的内容 但问题是,如果黑暗中有任何物体,它们仍然会被渲染,玩家可以看到它们。我可以拍摄一条光线,看看它们是否在视线范围内,但这会有点麻烦,因为光线将在对象的中心拍摄,例如,如果仅显示其肩部,则不会渲染对象。

我正在制作一个2d游戏,我想制作2d可见性。因此,我的想法是制作地图,然后用另一个黑色(例如)多边形遮罩它,以便玩家可以通过地图上的黑色多边形看到它。所以我的想法是通过黑色多边形画一个洞(多边形),以便看到黑色多边形下方的地图。我已经做了可见性,但我不知道如何制作面具

到目前为止,这就是该计划的内容

但问题是,如果黑暗中有任何物体,它们仍然会被渲染,玩家可以看到它们。我可以拍摄一条光线,看看它们是否在视线范围内,但这会有点麻烦,因为光线将在对象的中心拍摄,例如,如果仅显示其肩部,则不会渲染对象。有人能帮忙吗

编辑-适用于任何想做同样事情的人 我用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);  
    }

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

获取贴图的BuffereImage和遮罩的BuffereImage,并使用两个for循环,检查遮罩在位置(X,Y)处是否有黑色像素,如果是,则将贴图的像素添加到新的BuffereImage到位置(X,Y),否则将黑色像素添加到位置(X,Y)处生成的BuffereImage

编辑: 小位伪码

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);
        }
    }
}
buffereImage mapBI=..//映射为BuffereImage
BuffereImage maskBI=..//将掩码设置为BuffereImage
BuffereImage结果BI=…//与掩码大小相同的新BuffereImage
对于(i=0;i

我希望你明白我的意思

您好,到目前为止我了解您的问题,当遮罩在同一位置上有一个黑色像素时,您打算让贴图的每个像素都可见吗? 如果我是对的,那么:

获取贴图的BuffereImage和遮罩的BuffereImage,并使用两个for循环,检查遮罩在位置(X,Y)处是否有黑色像素,如果是,则将贴图的像素添加到新的BuffereImage到位置(X,Y),否则将黑色像素添加到位置(X,Y)处生成的BuffereImage

编辑: 小位伪码

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);
        }
    }
}
buffereImage mapBI=..//映射为BuffereImage
BuffereImage maskBI=..//将掩码设置为BuffereImage
BuffereImage结果BI=…//与掩码大小相同的新BuffereImage
对于(i=0;i

我希望你明白我的意思

好吧,这是个好主意,但我正在用图形2D绘图,我不知道如何仅用图形编辑像素。我使用的算法和这个相同。你知道如何在没有编辑的情况下制作每个像素吗?你可以将Graphics2D转换为BuffredImage来访问每个像素:请阅读“是”,但这不会很慢,因为如果我有一个大分辨率,它会慢很多。如果我在遮罩上画一个整体,然后先画地图,然后再画遮罩,我不需要穿过每个像素,如果可能的话,尽管这是可能的,但是你必须知道在哪里画洞,并且信息只存储在遮罩中。另一个选项是定义一个遮罩对象,该对象包含有关未绘制的圆或矩形的信息,然后在该遮罩对象的边上绘制多边形。圆可能有点困难,但矩形应该很容易解决。是的,我可以尝试两种方法。谢谢你的帮助和快速的回答!好吧,这是个好主意,但我正在用图形2D绘图,我不知道如何仅用图形编辑像素。我使用的算法和这个相同。你知道如何在没有编辑的情况下制作每个像素吗?你可以将Graphics2D转换为BuffredImage来访问每个像素:请阅读“是”,但这不会很慢,因为如果我有一个大分辨率,它会慢很多。如果我在遮罩上画一个整体,然后先画地图,然后再画遮罩,我不需要穿过每个像素,如果可能的话,尽管这是可能的,但是你必须知道在哪里画洞,并且信息只存储在遮罩中。另一个选项是定义一个遮罩对象,该对象包含有关未绘制的圆或矩形的信息,然后在该遮罩对象的边上绘制多边形。圆可能有点困难,但矩形应该很容易解决。是的,我可以尝试两种方法。谢谢你的帮助和快速的回答!