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