簡體   English   中英

java grapics 的 2D 可見性(戰爭迷霧)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM