LibGdx对象数组

时间:2016-12-15 05:18:49

标签: arrays object libgdx

我在libGdx项目中创建了一个对象数组,如下所示:

Array<Bird> birds = new Array<Bird>();

这里Bird是一个对象类。

我想在屏幕上逐个绘制10个Bird对象。所以我确实喜欢这个。

private void MakeBird() {

    Bird b = objectFactory.createBird();

    for (int i = 0; i < 10; i++) {
        birds.add(b);

    }

}

objectFactory的createBird方法:

public Bird createBird() {
    Bird bird = new Bird();
    bird.setPosition(0,0);
    return bird;
}

这里我只想要10个对象。但是当我尝试打印数组大小时,它会连续递增。我怎样才能正确实现? 我也想知道如何使用spriteBatch绘制这些数组对象。 如果我用代码得到解释,那将非常有用。

2 个答案:

答案 0 :(得分:2)

为了保持birds数组的大小不变,您需要将MakeBird()函数修改为此

private void MakeBird() {
    int birdsToAdd = 10 - birds.length;
    for (int i = 0; i < birdsToAdd ; i++) {
        birds.add(objectFactory.createBird());
    }
}

您的MakeBird()版本只会将相同的对象添加十次到birds数组中。那么,为什么这么糟糕?因为Java对象是引用类型,这意味着如果修改一个对象,则对该对象的所有引用也将更改。在您的情况下,如果您更改阵列中一只鸟的位置,所有鸟的位置都将改变。我不知道这是否是故意的。但是如果你想添加不同的Bird个对象,你应该像我上面实现的那样使用MakeBird()函数。很好地抓住了marius

关于如何将render这些对象添加到屏幕的第二个查询,您可以做的是,将Bird类更新为包含render或{{1}方法(您可以根据需要为方法命名),在主类中,您应该更新draw方法以调用render类的render/draw方法。你可以这样做

Bird

答案 1 :(得分:1)

每次for循环运行都需要创建一个新的Bird对象。所以请写birds.add(objectFactory.createBird())而不是birds.add(b)。我认为应该解决第一个错误。

你需要实现以下内容,就像它被描述为here

public class Game implements ApplicationAdapter {
    private SpriteBatch batch;
    private Texture texture;

    public void create () {
        batch = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("example.png"));
    }

    public void render () {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // This cryptic line clears the screen.
        batch.begin();
        batch.draw(texture, 10, 10);
        batch.end();
    }
}

但我真的建议你使用Box2D,因为它非常易于使用,你可以找到很多教程。