Bạn có một liên kết rất hữu ích về khái niệm giảng dạy box2D và libgdx về logic và kết xuất. here
Sau đó, bạn có thể tách phần logic của phần làm như thế này:
logic phần:
private void createBottleBody() {
// 0. Create a loader for the file saved from the editor.
BodyEditorLoader loader = new BodyEditorLoader(sourceFile);
// 1. Create a BodyDef, as usual.
BodyDef bd = new BodyDef();
bd.position.set(0, 0);
bd.type = BodyType.DynamicBody;
// 2. Create a FixtureDef, as usual.
FixtureDef fd = new FixtureDef();
fd.density = 1;
fd.friction = 0.5f;
fd.restitution = 0.3f;
// 3. Create a Body, as usual.
bottleModel = world.createBody(bd);
// 4. Create the body fixture automatically by using the loader.
loader.attachFixture(bottleModel, "test01", fd, BOTTLE_WIDTH);
}
Render phần:
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);
...
}
Bộ nạp: Trong liên kết bạn có thể tìm thấy một bộ nạp.
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);
}
}
Và cuối cùng ... mô hình
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>();
}
Hy vọng nó sẽ giúp!
Bạn đang sử dụng một số khung công tác, chẳng hạn như andengine hoặc smth? – Pavel
có vẻ như anh ta đang sử dụng LibGDX – jellyfication