Reputation: 536
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
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
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