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

编辑 - 我根据前 2 个建议采取了行动,现在程序输出此错误

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

在这一行上goldArray[i] = new Gold(rect, gold);

我注意到你的黄金类,这是一个精灵,也有对其他一些精灵的引用,而另一个精灵是你设置区域的一个,而不是你正在绘制的那个。删除对黄金类中另一个精灵的所有引用。

另外,最好不要在精灵中引用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;
    }
//...
}

因为Gold类的构造函数不调用超类的(Sprite)构造函数,所以默认构造函数是隐式调用的。如果您查看 Sprite 的默认构造函数的文档,您会发现它特别指出:

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

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

setRegion(gold);

也有不同的解决方案。这完全取决于您要完成的目标。

最新更新