Jan Lovšin Jan Lovšin - 2 months ago 10
Android Question

Vector2 is off - libgdx/java

game.batch.begin();
for (Array obstacle_array123: obstacle_array) {
body = obstacle_array123;
for (Body bodies: body) {
if (bodies.getUserData() instanceof Array && bodies.isActive()) {
sprites_array = (Array)bodies.getUserData();
for (int fix_pos = 0; fix_pos < sprites_array.size; fix_pos++) {
sprite = sprites_array.get(fix_pos);
if (verts.size != 0) verts.removeRange(0, verts.size - 1);
f = bodies.getFixtureList().get(fix_pos);
s = (PolygonShape)f.getShape();
transform = bodies.getTransform();

for (int i = 0; i < s.getVertexCount(); i++)
{
s.getVertex(i, tmp);
transform.mul(tmp);
verts.add(new Vector2(tmp));
}
rotation_point.set((verts.get(0).x + verts.get(1).x + verts.get(2).x + verts.get(3).x) / 4, (verts.get(0).y + verts.get(1).y + verts.get(2).y + verts.get(3).y) / 4);

sprite.setPosition(rotation_point.x - sprite.getWidth() / 2, rotation_point.y - sprite.getHeight() / 2);
sprite.setRotation(bodies.getAngle() * MathUtils.radiansToDegrees);
sprite.draw(game.batch);
}
}
}
}
game.batch.end();


I have a game where my bodies are made from multiple square fixtures, so this is the code to render each square sprite on each square fixture.

2 problems - 1.st --> it only renders the first sprite in the array

2.nd --> if you look at the following loop (SOLVED)

for (int i = 0; i < s.getVertexCount(); i++)
{
s.getVertex(i, tmp);
transform.mul(tmp);
verts.add(new Vector2(tmp));
}


well it is apperantly different compared to

for (int i = 0; i < s.getVertexCount(); i++)
{
s.getVertex(i, tmp);
transform.mul(tmp);
verts.add(tmp);
}


The spawned coordinates in 2nd example are wrong for half width and half height of the square.

When I try to get the coordinated from both examples the numbers are the same, but when setting the sprite position, 2nd example goes off.

Answer

You should probably ask both questions separately, but to answer your second question, then they ARE different.

In the first one you add a new Vector2 to verts each time through the loop. So verts will end up holding a load of different Vector2's.

In the second one you add the same Vector2 to verts over and over again, so it will just have one Vector2 with the same value over and over again (remember Java is pass by reference).

Caveat - My answer assumes that verts is some sort of standard collection or a libgdx Array.