我正在进行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);
}
答案 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)
算法很简单。
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。