You have a very useful link about box2D and libgdx learning concepts about logic and rendering. here
Then you can split the logical part of the rendering part as follows:
The logical part:
private void createBottleBody() {
Part of rendering:
public void render() { Vector2 bottlePos = bottleModel.getPosition().sub(bottleModelOrigin); bottleSprite.setPosition(bottlePos.x, bottlePos.y); bottleSprite.setOrigin(bottleModelOrigin.x, bottleModelOrigin.y); bottleSprite.setRotation(bottleModel.getAngle() * MathUtils.radiansToDegrees); ... }
Loader: you can find the loader from the link.
public void attachFixture(Body body, String name, FixtureDef fd, float scale) { //Load the rigidModel by key RigidBodyModel rbModel = (RigidBodyModel) this.model.rigidBodies.get(name); if (rbModel == null) throw new RuntimeException("Name '" + name + "' was not found."); //Loading polygons Vector2 origin = this.vec.set(rbModel.origin).mul(scale); Vector2[] vertexes; PolygonModel polygon; for (int i = rbModel.polygons.size()-1; 0 <= i; i--) { polygon = (PolygonModel) rbModel.polygons.get(i); vertexes = polygon.vectorBuffer; //Loading vertexes (scaled) from polygon for (int ii = vertexes.length-1; 0 <= ii; ii--) { vertexes[ii] = new Vector2().set((Vector2) polygon.vertices.get(ii)).mul(scale); vertexes[ii].sub(origin); } //sets vertexs to polygon this.polygonShape.set(vertexes); fd.shape = this.polygonShape; body.createFixture(fd); } //Loading circles CircleModel circle; Vector2 center; float radius; for (int i = rbModel.circles.size()-1; 0 <= i; i--) { circle = (CircleModel) rbModel.circles.get(i); center = new Vector2().set(circle.center).mul(scale); radius = circle.radius * scale; this.circleShape.setPosition(center); this.circleShape.setRadius(radius); fd.shape = this.circleShape; body.createFixture(fd); } }
And finally ... models
public static class CircleModel { public final Vector2 center = new Vector2(); public float radius; } public static class PolygonModel { public final List<Vector2> vertices = new ArrayList<Vector2>(); private Vector2[] vectorBuffer; } public static class RigidBodyModel { public String name; public String imagePath; public final Vector2 origin = new Vector2(); public final List<PolygonModel> polygons = new ArrayList<PolygonModel>(); public final List<CircleModel> circles = new ArrayList<CircleModel>(); } public static class Model { public final Map<String, RigidBodyModel> rigidBodies = new HashMap<String, RigidBodyModel>(); }
Hope this helps!
Ricardo
source share