2016-07-05 5 views
7

現在、私の主な描画コンポーネントとしてSwingを使って2D Javaゲームを開発中です。すべてのオブジェクトにはシャドウ(BufferedImage)がありますが、すべてのシャドウは他のシャドウと重なっています。影がお互いに重ならないようにすることは可能ですか?なぜなら、オブジェクトがその下にある場合には、影がプレイヤーに引き寄せたいからであり、オブジェクトがプレーヤーの上にある場合ではないからです。スイングでJavaゲームの2Dオーバーラップシャドウ

Screenshot

私はアルファ合成見てきましたが、私はソースアウトが必要推測:ここではわかりやすくするための画像ですか?私はまた、透明性のないすべての影を1つのレイヤーに描画し、それを透明度で描画することを考えましたが、以前のようにプレーヤーや他のオブジェクトを描画しません。

私はJPanelであり、paintComponentメソッドをオーバーライドするDrawオブジェクトを持っています。この方法では、現在の部屋の床を描画し、現在の部屋に属するオブジェクトのリストを繰り返して、各オブジェクトの描画メソッドを呼び出してすべてを描画します。

オブジェクトのdrawメソッド:

public void draw(Graphics g) { 
    if (visible && checkInScreen()) { 

     // The required drawing location 
     int drawLocationX = getX() - globalCameraX; 
     int drawLocationY = getY() - globalCameraY; 

     if (shadow) { 
      g.drawImage(shadowImages.get(imageIndex), 
        drawLocationX + shadowOffset.x + (getImageWidth()/2), 
        drawLocationY + shadowOffset.y, null); 
     } 
     g.drawImage(images.get(imageIndex), drawLocationX, drawLocationY, null); 

     //Collisionbox 
     if (SHOW_COLLISION_BOXES){ 
      g.setColor(Color.WHITE); 
      g.drawRect(drawLocationX + getCollBoxX(), drawLocationY + getCollBoxY(), getCollBoxW() - getCollBoxX(), getCollBoxH() - getCollBoxY()); 
     } 
    } 
} 

私の謝罪、この質問は、すでに依頼されているが、私はこのような似たような見つけることができなかった場合。

+0

すべてのシャドウを1つのレイヤーに描画することをお勧めします。最後にあなたの影を描くなら、なぜ彼らはプレーヤーや物を描かないのでしょうか? – eldo

+0

しかし、影が影を投じるオブジェクトを描くことはありませんか?影が部分的にオブジェクトの後ろにあるので、 –

+0

あなたの影が現在表示されている部分のみである場合は、Nopeを指定しないでください。だから木の影は木自体を覆うことはありません。 – eldo

答えて

1

これを解決するには、シャドウレイヤのビットマップを使用することです。つまり、 は、シャドウテクスチャをブール値(シャドウピクセルの位置を表す)の2D配列として保存しています。

これでできることは論理的にまたはシャドウマップを一緒にして単一のレイヤーを作成することです。このレイヤーをツリーテクスチャの背後に重ねてシャドウを作成することができます。

ブール値を浮動小数点に変更してシャドウの色/強度を表現し、次に大きな計算でシャドウをマージすることができます。

class ShadowMap { 

    public int xPos, yPos; 
    public boolean[][] array; 

    public ShadowMap(int xPos, int yPos, boolean[][] array) { 
     this.xPos = xPos; 
     this.yPos = yPos; 
     this.array = array; 
    } 

} 

ShadowLayerクラスは影を画素毎に存在する場合を含む、画面全体の2次元配列を作成します:

以下シャドウマップクラスは、各影のデータを格納するために使用されます

public static Color ajustPixelForShadows(int x, int y, Color pixel) { 
    return ShadowMap.array[x][y] ? pixel.darken() : pixel; 
} 
:シャドウマップが同じピクセルに影を持っている場合、このShadowLayerクラスを使用
class ShadowLayer { 

    public static boolean[][] array = new boolean[SCREEN_WIDTH][SCREEN_HEIGHT]; 

    public static makeNew(ShadowMap[] shadows) { 
     for (int x = 0; x < SCREEN_WIDTH; x++) { 
      for (int y = 0; y < SCREEN_HEIGHT; y++) { 
       array[x][y] = false; 
      } 
     } 
     for (ShadowMap map : shadows) { 
      for (int i = 0; i < SCREEN_WIDTH; i++) { 
       for (int j = 0; j < SCREEN_HEIGHT; j++) { 
        // Logical or such that the pixel at (x, y) has a shadow 
        // if any shadow map also has a shadow at pixel (x, y) 
        array[i + map.xPos][j + map.yPos] |= map.array[i][j]; 
       } 
      } 
     } 
    } 

} 

、あなただけの画面上の各ピクセルを暗くする必要があります

関連する問題