2016-04-10 12 views
1

Ich bin dabei, ein 2D-Spiel aufzubauen und versuche Pixelpixel/perfekte Kollisionserkennung zu implementieren.2d Kollisionserkennung - Versuch, alle nicht transparenten Pixel von zwei Sprites zu bekommen

Mein Problem ist, ich versuche, alle nicht transparenten Pixel meiner Sprites zu bekommen, indem ich die getRGB() - Methode mit gepufferten Bildern verwende, aber ich kann diese Methode nur für gepufferte Bilder verwenden.

Ich hatte gehofft, Sie könnten mir in die richtige Richtung zeigen, was ich versuche zu tun. Im Folgenden sind die Methoden meines Spiels Klasse in ich arbeite:

Diese Methode soll

public HashSet<String> getMask(Sprite character){ 

HashSet <String> mask = new HashSet<String>(); 
    int pixel; 
    int alpha; 

    for(int i = 0; i < character.getWidth(); i++){ 
     for(int j = 0; j < character.getHeight(); i++){ 

      pixel = character.getRGB(i,j); 
      alpah = (pixel >> 24) & 0xff;  

      if(alpha != 0){ 
       mask.add((character.getX + i) + "," + (character.getY - j)); 
      } 
     } 
    } 
    return mask; 
} 

Methode In My Sprite alle nicht transparente Pixel So erhalten Sie die Kollisionen prüfen

public boolean checkCollision(Sprite a, Sprite b){  
    // This method detects to see if the images overlap at all. If they do,  collision is possible 
    int ax1 = a.getX(); 
    int ay1 = a.getY(); 
    int ax2 = ax1 + a.getWidth(); 
    int ay2 = ay1 + a.getHeight(); 
    int bx1 = b.getX(); 
    int by1 = b.getY(); 
    int bx2 = bx1 + b.getWidth(); 
    int by2 = by1 + b.getHeight(); 

    if(by2 < ay1 || ay2 < by1 || bx2 < ax1 || ax2 < bx1){ 
      return false; // Collision is impossible. 
    } 
    else {// Collision is possible. 
     // get the masks for both images 
     HashSet<String> maskPlayer1 = getMask(shark); 
     HashSet<String> maskPlayer2 = getMask(torpedo); 

     maskPlayer1.retainAll(maskPlayer2); // Check to see if any pixels in maskPlayer2 are the same as those in maskPlayer1 

     if(maskPlayer1.size() > 0){ // if so, than there exists at least one pixel that is the same in both images, thus 
      System.out.println("Collision" + count);// collision has occurred. 
      count++; 
      return true; 

     } 
    } 
    return false; 
} 

In der getMask() - Methode oben können Sie sehen, dass ich sage: character.getRGB() aber da das Zeichen vom Typ Sprite ist, bekomme ich einen Fehler, da ich nur getRGB () mit einem gepufferten Bild.

Soweit mir bekannt ist, ist die getRGB() glücklich, die aktuellen Pixel zu erhalten, die das gepufferte Bild im Spiel bewegt, aber nicht glücklich, die aktuellen Pixel für einen Sprite zu bekommen. Ich könnte falsch verstehen, wie diese Methode funktioniert?

Also ich frage mich, ob es um diesen Fehler irgendeinen Weg gibt, oder wenn nicht, würden Sie in der Lage sein, mich

Dank in die richtige Richtung jeder

Antwort

0

Sprite ist einige Klasse zu zeigen, das Rechteck erstreckt oder hat solche Eigenschaften.

Sie können ein BufferedImage Mitglied, um es hinzuzufügen: wenn Sie die RGB aus dem Charakter bekommen Sie es von diesem BufferedImage

int getRGB(int i, int j) { 
    return myBufferedImage.getRGB(i, j); 
} 

bekommen, wo Sie in Sprite haben

class Sprite { 

    BufferedImage myBufferedImage; 


    public int getRGB(int i, int j) { 

    ......... as shown above 

    } 

    .... 


} 
+0

Ich bin nicht sicher Was meinst du? Meinst du set myBufferedImage als globale Variable? Wenn ich meinen gesamten Spielkurs veröffentlichen würde, könntest du mir helfen zu verstehen – Chris

+0

ja zeig die Sprite Klasse – gpasch

+0

Sicher, gib mir 5 Minuten – Chris

Verwandte Themen