2016-05-27 5 views
0

In diesem folgenden Code habe ich versucht, eine Münzklasse zu erstellen und es so zu machen, dass es ein Sprite ist. Ich habe versucht, alle diese Sprites zu einem Array hinzuzufügen und dann das Array auf den Bildschirm zu zeichnen. Es erzeugt keine Fehler, nur druckt die Grafik nicht auf dem Bildschirm. Ich wollte auch wissen, ob ich das Sprite für Kollisionen verwenden könnte. Ich weiß, dass mein Code nicht sehr gut ist, da er ziemlich unordentlich ist und ich nur versuche, eine Lösung zu finden. DankLibgdx Hinzufügen von Sprites zum Array und Zeichnen sie zum Bildschirm

public class Gold extends Sprite { 
    private SpriteBatch batch; 
    private TiledMap map; 
    private Sprite sprite; 
    private Boolean isCollected; 

    public Gold(TiledMap map, Rectangle bounds, Texture gold) { 
     this.map = map; 

     sprite = new Sprite(gold); 
     sprite.setSize(bounds.width/MarioBros.PPM, bounds.height/MarioBros.PPM); 
     sprite.setPosition(bounds.x/MarioBros.PPM, bounds.y/MarioBros.PPM); 
     isCollected = false; 
    } 

for (MapObject object : map.getLayers().get(5).getObjects().getByType(RectangleMapObject.class)) { 
      Rectangle rect = ((RectangleMapObject) object).getRectangle(); 

      for(int i = 0; i < map.getLayers().get(5).getObjects().getCount() - 1; i++){ 
       goldArray[i] = new Gold(map, rect, gold); 
      } 
     } 

public void drawGold(TiledMap map){ 
     for(int i = 0; i < map.getLayers().get(5).getObjects().getCount() - 1; i++){ 
      goldArray[i].draw(batch); 
     } 
    } 

Im Render:

mapCreator.drawGold(map); 

EDIT - handelte ich auf den ersten 2 Anregungen und jetzt gibt das Programm diesen Fehler

Exception in thread "LWJGL Application" java.lang.NullPointerException 
    at com.alexcz.mariobros.Tools.MapCreator.<init>(MapCreator.java:77) 

auf dieser Linie goldArray[i] = new Gold(rect, gold);

Antwort

1

Ich habe bemerkt, dass Ihre Gold-Klasse, die ein Sprite ist, auch einen Verweis auf ein anderes Sprite hat und dass ein anderes Sprite das ist, auf das Sie eine Region gesetzt haben und das Sie nicht zeichnen. Entfernen Sie alle Verweise auf ein anderes Sprite in Ihrer Gold-Klasse.

Außerdem wäre es besser, keinen Hinweis auf einen SpriteBatch oder Ihre TiledMap in Ihrem Sprite zu haben. Das führt zu unnötiger Kopplung, die zu einem Fehler führen könnte, oder es macht es nur schwieriger, den Code zu pflegen, wenn er komplizierter wird.

public class Gold extends Sprite { 
    private boolean isCollected; //only use a primitive wrapper if you really need one 

    public Gold(Rectangle bounds, Texture gold) { 
     super(gold); 

     setSize(bounds.width/MarioBros.PPM, bounds.height/MarioBros.PPM); 
     setPosition(bounds.x/MarioBros.PPM, bounds.y/MarioBros.PPM); 
     isCollected = false; 
    } 
//... 
} 
+0

Schauen Sie sich die Änderungen an. Danke –

+0

@alexczernnenk NullPointerExceptions sind in der Regel sehr einfach zu debuggen. Siehe http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – Tenfour04

1

Da der Konstruktor der Gold Klasse der Superklasse nicht nennen (Sprite) Konstruktor, den Standardkonstruktor heißt implizit. Wenn Sie einen Blick auf die documentation des Standardkonstruktors von Sprite nehmen Sie werden sehen, es ausdrücklich fest, dass:

... Erzeugt eine nicht initialisierte Sprite. Das Sprite benötigt eine Texturregion und Grenzen, bevor es gezeichnet werden kann.

Also das erklärt, warum nichts gezeichnet wird. Eine Möglichkeit, dies zu beheben, ist ein Texture Region. So in der Gold Konstruktor fügen Sie den folgenden:

setRegion(gold); 

Es gibt zu anderen Lösung. Alles hängt davon ab, was Sie erreichen möchten.

+0

Sehen Sie sich die Änderungen an. Danke –

Verwandte Themen