Niranjana
Niranjana

Reputation: 536

LibGdx object array

I have created an array of objects in my libGdx project like this:

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

Here Bird is one object class.

I want to draw 10 Bird objects one by one on the screen.So I did like this.

private void MakeBird() {

    Bird b = objectFactory.createBird();

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

    }

}

createBird method of objectFactory:

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

Here I want only 10 objects.But when I try to print the array size,it is incrementing continuousely.How can I implement this properly? I also want to know how to draw these array objects using spriteBatch. It will be very helpful if I get an explanation with code.

Upvotes: 0

Views: 1110

Answers (2)

user7266839
user7266839

Reputation:

In order to keep the size of the birds array constant you need to modify your MakeBird() function into this

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

Your version of MakeBird() would simply add the same object ten times into the birds array. So, why is this bad? Because Java objects are reference type, meaning that if you modify one object all the references to that object will also change. In your case, if you change the position of one bird in the array, all the birds position will change. I don't know if this is intentional. But if you want to add different Bird objects then you should use the MakeBird() function like I implemented above. Nice catch there by marius.

As for your second query about how to render these objects to the screen, what you can do is, update your Bird class to contain a render or a draw method (you can name the method whatever you want) and in your main class you should update your render method to call the render/draw method of the Bird class. You can do this as such

//Bird class
class Bird {
    //Your data members
    //Your member functions

    public void draw(SpriteBatch batch) {
        batch.draw(some_bird_image, bird_x_position, bird_y_position);
    }
}

//Render method in main class
public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    batch.begin();
    for(Bird bird : birds) {
        bird.draw(batch);
    }
    batch.end();
}

Upvotes: 2

Marius
Marius

Reputation: 412

You have to create a new Bird object every for-loop run. So write birds.add(objectFactory.createBird()) instead of birds.add(b). I think that should fix the first error.

You somehow need to implement the following like it is decribed 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();
    }
}

But I really recommend you to use Box2D, because it is very ease to use and you can find plenty of tutorials for it.

Upvotes: 1

Related Questions