package com.indignado.logicbricks.utils.builders; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.*; import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; import java.util.ArrayList; /** * clone common-gdx project * * @author acoppes */ public class BodyBuilder { private final World world; FixtureDefBuilder fixtureDefBuilder; private BodyDef bodyDef; private ArrayList<FixtureDef> fixtureDefs; private ArrayList<Object> fixtureUserDatas; private Vector2 position = new Vector2(); private float angle; private MassData massData = new MassData(); private boolean massSet; public BodyBuilder(World world) { this.world = world; this.fixtureDefBuilder = new FixtureDefBuilder(); this.fixtureDefs = new ArrayList<FixtureDef>(); this.fixtureUserDatas = new ArrayList<Object>(); reset(true); } public FixtureDefBuilder fixtureDefBuilder() { return fixtureDefBuilder; } private void reset(boolean disposeShapes) { if (fixtureDefs != null && disposeShapes) { for (int i = 0; i < fixtureDefs.size(); i++) { FixtureDef fixtureDef = fixtureDefs.get(i); fixtureDef.shape.dispose(); } } bodyDef = new BodyDef(); fixtureDefs.clear(); fixtureUserDatas.clear(); angle = 0f; position.set(0f, 0f); massSet = false; } public BodyBuilder type(BodyType type) { bodyDef.type = type; return this; } public BodyBuilder bullet() { bodyDef.bullet = true; return this; } public BodyBuilder fixedRotation() { bodyDef.fixedRotation = true; return this; } public BodyBuilder linearDamping(float linearDamping) { bodyDef.linearDamping = linearDamping; return this; } public BodyBuilder angularDamping(float angularDamping) { bodyDef.angularDamping = angularDamping; return this; } public BodyBuilder fixture(FixtureDefBuilder fixtureDef) { return fixture(fixtureDef, null); } public BodyBuilder fixture(FixtureDefBuilder fixtureDef, Object fixtureUserData) { fixtureDefs.add(fixtureDef.build()); fixtureUserDatas.add(fixtureUserData); return this; } public BodyBuilder fixture(FixtureDef fixtureDef) { return fixture(fixtureDef, null); } public BodyBuilder fixture(FixtureDef fixtureDef, Object fixtureUserData) { fixtureDefs.add(fixtureDef); fixtureUserDatas.add(fixtureUserData); return this; } public BodyBuilder fixtures(FixtureDef[] fixtureDefs) { return fixtures(fixtureDefs, null); } public BodyBuilder fixtures(FixtureDef[] fixtureDefs, Object[] fixtureUserDatas) { if (fixtureUserDatas != null && (fixtureDefs.length != fixtureUserDatas.length)) throw new RuntimeException("length mismatch between fixtureDefs(" + fixtureDefs.length + ") and fixtureUserDatas(" + fixtureUserDatas.length + ")"); for (int i = 0; i < fixtureDefs.length; i++) { this.fixtureDefs.add(fixtureDefs[i]); Object fixtureUserData = fixtureUserDatas != null ? fixtureUserDatas[i] : null; this.fixtureUserDatas.add(fixtureUserData); } return this; } public BodyBuilder mass(float mass) { this.massData.mass = mass; this.massSet = true; return this; } public BodyBuilder inertia(float intertia) { this.massData.I = intertia; this.massSet = true; return this; } public BodyBuilder position(float x, float y) { this.position.set(x, y); return this; } public BodyBuilder angle(float angle) { this.angle = angle; return this; } public Body build() { return build(true); } public Body build(boolean disposeShapes) { Body body = world.createBody(bodyDef); for (int i = 0; i < fixtureDefs.size(); i++) { FixtureDef fixtureDef = fixtureDefs.get(i); Fixture fixture = body.createFixture(fixtureDef); fixture.setUserData(fixtureUserDatas.get(i)); } if (massSet) { MassData bodyMassData = body.getMassData(); // massData.center.changeCurrentState(position); massData.center.set(bodyMassData.center); // massData.I = bodyMassData.I; body.setMassData(massData); } body.setTransform(position, angle); reset(disposeShapes); return body; } }