Libgdx将精灵添加到数组并将它们绘制到屏幕上

时间:2016-05-27 08:40:57

标签: java libgdx

在下面的代码中,我尝试创建一个硬币类,并使其成为一个精灵。我试图将所有这些精灵添加到一个数组,然后将数组绘制到屏幕上。它不会产生任何错误,只是不会将图形打印到屏幕上。我也想知道我是否可以使用精灵来测试碰撞。我知道我的代码不是很好,因为它非常混乱,我只是想找到一个解决方案。感谢

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

在渲染中:

   mapCreator.drawGold(map);

编辑 - 我对前两个建议采取了行动,现在程序输出了这个错误

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

在此行goldArray[i] = new Gold(rect, gold);

2 个答案:

答案 0 :(得分:1)

因为Gold类的构造函数不调用超类(Sprite)构造函数,所以隐式调用默认构造函数。如果您查看Sprite的默认构造函数的documentation,您会看到它特别注意到:

  

...创建一个未初始化的精灵。 精灵在绘制之前需要一个纹理区域和边界设置

这就解释了为什么没有画出来。解决此问题的一种方法是设置Texture Region。所以在Gold构造函数中添加以下内容:

setRegion(gold);

也有不同的解决方案。这一切都取决于你想要完成的事情。

答案 1 :(得分:1)

我注意到你的Gold类,一个Sprite,也有一些其他sprite的引用,而另一个sprite就是你设置了一个区域的sprite,而不是你正在绘制的那个。删除Gold课程中对另一个精灵的所有引用。

此外,最好不要在Sprite中引用SpriteBatch或TiledMap。这引入了可能导致错误信件的不必要的耦合,或者只是让代码变得更加复杂时更难以维护代码。

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