java 图形的 2D 可见性(War 的雾)
2D visibility with java grapics (Fog of War)
我正在制作一个 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);
}
你好,到目前为止我已经理解你的问题了,你打算让地图的每个像素在蒙版的同一位置有一个黑色像素时可见吗?
如果我是对的那么:
获取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);
}
}
}
希望你明白我的意思。
我正在制作一个 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);
}
你好,到目前为止我已经理解你的问题了,你打算让地图的每个像素在蒙版的同一位置有一个黑色像素时可见吗? 如果我是对的那么:
获取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);
}
}
}
希望你明白我的意思。