2016-07-05 19 views
7

Şu an Swing'i birincil çizim bileşenim olarak kullanarak bir 2D Java oyunu geliştiriyorum. Her nesnenin bir gölgesi (BufferedImage) vardır, ancak her gölge diğer gölgelerle örtüşür. Gölgelerin birbiriyle çakışmaması mümkün mü? Çünkü hala nesnenin altında ise gölgeler oyuncuyu çekmek istiyorum ve eğer nesne oyuncunun üzerinde değilse.Java oyunu Swing ile 2B örtüşen gölgeler

Screenshot

Ben alfa birleştirme baktım, ben Kaynak Out ihtiyacım tahmin: İşte netlik için bir resim mi? Ayrıca, tüm gölgelerin (saydamlık olmadan) tek bir katman üzerinde çizildiğini düşündüm ve sonra onu şeffaflık ile çizdim ama daha sonra oyuncu ve daha önce olduğu gibi başka nesneler üzerinde çizmeyecek.

Bir JPanel olan bir Draw nesnesine sahibim ve paintComponent yöntemini geçersiz kılar. Bu yöntemde o anki odanın zemini çiziyorum ve o anki odaya ait nesnelerin listesi üzerinde yineliyorum ve her bir nesneyi çizme yöntemini her şey için çiziyorum.

nesne beraberlik yöntemi:

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

Özürlerimi bu soru zaten istendi ama böyle benzer bir şey bulamadık eğer.

+0

Tüm gölgelerinizi tek bir katmana çizmek iyi bir fikirdir. Gölgelerinizin sonunu çizerseniz neden oyuncu ve nesneler üzerinde çizim yapmıyorlar? – eldo

+0

Ancak gölgeler daha sonra "gölgeyi çeviren" nesnenin üzerine çizmez miydi? Gölgelerin sadece şu anda görülebilen parçalar olması durumunda, gölgeler kısmen nesnenin arkasındaysa –

+0

Yoktur. Yani ağaçların gölgesi hiç ağacın üstünü örtmez. – eldo

cevap

1

Bunu çözmek için ne yapacağım, bir gölge katmanı bitmapine sahip olmaktır. Bununla demek istediğim: , gölge dokularınızın 2B dizi boolean değeri olarak kaydedilmesini (gölge pikselinin konumunu temsil eder).

Bundan sonra yapabileceğiniz şey, gölgeleri oluşturmak için ağaç dokularının arkasına katlanabilen tek bir katman oluşturmak için mantıksal olarak veya gölge haritalarının bir araya getirilmesidir.

Gölgelerin rengini/yoğunluğunu göstermek için boole'ları yüzenlere değiştirmek isteyebilir, ardından gölgeleri bir araya getirmek için daha büyük bir hesaplama yapabilirsiniz.

:

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 sınıfı, bir gölge her bir piksel için mevcut ise, içeren tüm ekran için bir 2D dizisini oluşturur:

aşağıdaki shadowmap sınıfı her gölge için verileri depolamak için kullanılan

public static Color ajustPixelForShadows(int x, int y, Color pixel) { 
    return ShadowMap.array[x][y] ? pixel.darken() : pixel; 
} 
: shadowmap aynı piksel gölge varsa bu ShadowLayer sınıfını kullanarak
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]; 
       } 
      } 
     } 
    } 

} 

, sadece ekrandaki her pikseli karartmak gerekiyor