[英]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)否則,將黑色Pixel添加到位置(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);
}
}
}
我希望你明白我的意思。
而且它的算法非常簡單。
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.