2016-07-05 20 views
7

Ich entwickle gerade ein 2D Java Spiel mit Swing als meiner primären Zeichenkomponente. Jedes Objekt hat einen Schatten (BufferedImage), aber jeder Schatten überlappt andere Schatten. Ist es möglich, dass sich die Schatten nicht überlappen? Weil ich immer noch möchte, dass die Schatten über den Spieler ziehen, wenn das Objekt darunter ist, und nicht, wenn das Objekt über dem Spieler ist. Hier ist ein Bild für Klarheit:Java Spiel 2D überlappende Schatten mit Swing

Screenshot

Ich habe bei Alpha Blending sah, ich denke, ich brauche auslagern? Ich habe auch daran gedacht, alle Schatten (ohne Transparenz) auf eine Ebene zu zeichnen und dann mit Transparenz zu zeichnen, aber dann wird nicht wie zuvor über den Player und andere Objekte gezeichnet.

Ich habe ein Draw-Objekt, das ein JPanel ist und überschreibt die paintComponent-Methode. In dieser Methode zeichne ich den Boden des aktuellen Raums und dann iteriere ich über die Liste der Objekte, die zum aktuellen Raum gehören, und rufe die Zeichenmethode jedes Objekts auf, um alles zu zeichnen.

Das Objekt Streck-Verfahren:

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()); 
     } 
    } 
} 

Ich entschuldige mich, wenn diese Frage schon gefragt worden, aber ich konnte nicht etwas Ähnliches wie diese finden.

+0

Zeichnen Sie alle Ihre Schatten auf einer Ebene ist eine gute Idee. Wenn du deine Schatten zuletzt zeichnest, warum werden sie nicht auf Spieler und Objekte zeichnen? – eldo

+0

Aber würde nicht der Schatten dann über das Objekt zieht, dass „den Schatten wirft“? Da die Schatten sind teilweise hinter dem Objekt –

+0

Nö, wenn Ihr Schatten nur Teile, die jetzt sichtbar sind. Ein Baumschatten wird also niemals den Baum selbst bedecken. – eldo

Antwort

1

Was ich tun würde, um dies zu lösen, ist eine Schatten-Bitmap. Mit dem meine ich: haben Sie Ihre Schatten Texturen als 2D-Array von booleschen Werten gespeichert (die die Position eines Schattenpixels darstellen).

Was Sie mit diesem zu tun ist, um dann logisch oder der Schatten bildet zusammen eine einzelne Schicht zu schaffen, die sich hinter den Baum Texturen überlagert werden können, um die Schatten zu erstellen.

Sie möchten die booleans ändern die Farbe/Intensität des Schattens darstellen schwimmt, dann eine größere Berechnung die Schatten zusammen zu fusionieren.

Die unten ShadowMap-Klasse wird verwendet für jeden Schatten der Daten zu speichern:

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; 
    } 

} 

Die ShadowLayer Klasse einen 2D-Array für den gesamten Bildschirm erzeugt, enthält, wenn ein Schatten für jedes Pixel vorhanden ist:

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]; 
       } 
      } 
     } 
    } 

} 

diese ShadowLayer-Klasse verwenden, müssen Sie nur jedes Pixel auf dem Bildschirm verdunkeln, wenn der ShadowMap einen Schatten auf dem gleichen Pixel hat:

public static Color ajustPixelForShadows(int x, int y, Color pixel) { 
    return ShadowMap.array[x][y] ? pixel.darken() : pixel; 
}