Tôi đã tạo ra một con búp bê giẻ rách bằng cách sử dụng các cơ thể động (hình chữ nhật) và các khớp xoay tròn đơn giản (với các góc dưới và trên). Khi con búp bê giẻ rách của tôi chạm đất (là một cơ thể tĩnh), các cơ thể dường như bồn chồn và các khớp xương tách ra.
Có vẻ như các cơ thể đang dính vào mặt đất, và động lực của con búp bê giẻ rách kéo khớp ra (xem ảnh chụp màn hình bên dưới).
Tôi không chắc nó có liên quan hay không, nhưng tôi đang sử dụng trình bao bọc Java Badlogic GDX cho Box2D. Đây là một số đoạn của những gì tôi nghĩ là mã có liên quan nhất:
private RevoluteJoint joinBodyParts(
Body a, Body b, Vector2 anchor,
float lowerAngle, float upperAngle) {
RevoluteJointDef jointDef = new RevoluteJointDef();
jointDef.initialize(a, b, a.getWorldPoint(anchor));
jointDef.enableLimit = true;
jointDef.lowerAngle = lowerAngle;
jointDef.upperAngle = upperAngle;
return (RevoluteJoint)world.createJoint(jointDef);
}
private Body createRectangleBodyPart(
float x, float y, float width, float height) {
PolygonShape shape = new PolygonShape();
shape.setAsBox(width, height);
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.y = y;
bodyDef.position.x = x;
Body body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 10;
fixtureDef.filter.groupIndex = -1;
fixtureDef.filter.categoryBits = FILTER_BOY;
fixtureDef.filter.maskBits = FILTER_STUFF | FILTER_WALL;
body.createFixture(fixtureDef);
shape.dispose();
return body;
}
Tôi đã bỏ qua phương pháp tạo đầu, vì nó khá giống với phương pháp hình chữ nhật (chỉ sử dụng hình dạng cricle).
Những phương thức này được sử dụng như vậy:
torso = createRectangleBodyPart(x, y + 5, 0.25f, 1.5f);
Body head = createRoundBodyPart(x, y + 7.4f, 1);
Body leftLegTop = createRectangleBodyPart(x, y + 2.7f, 0.25f, 1);
Body rightLegTop = createRectangleBodyPart(x, y + 2.7f, 0.25f, 1);
Body leftLegBottom = createRectangleBodyPart(x, y + 1, 0.25f, 1);
Body rightLegBottom = createRectangleBodyPart(x, y + 1, 0.25f, 1);
Body leftArm = createRectangleBodyPart(x, y + 5, 0.25f, 1.2f);
Body rightArm = createRectangleBodyPart(x, y + 5, 0.25f, 1.2f);
joinBodyParts(torso, head, new Vector2(0, 1.6f), headAngle);
leftLegTopJoint = joinBodyParts(torso, leftLegTop, new Vector2(0, -1.2f), 0.1f, legAngle);
rightLegTopJoint = joinBodyParts(torso, rightLegTop, new Vector2(0, -1.2f), 0.1f, legAngle);
leftLegBottomJoint = joinBodyParts(leftLegTop, leftLegBottom, new Vector2(0, -1), -legAngle * 1.5f, 0);
rightLegBottomJoint = joinBodyParts(rightLegTop, rightLegBottom, new Vector2(0, -1), -legAngle * 1.5f, 0);
leftArmJoint = joinBodyParts(torso, leftArm, new Vector2(0, 1), -armAngle * 0.7f, armAngle);
rightArmJoint = joinBodyParts(torso, rightArm, new Vector2(0, 1), -armAngle * 0.7f, armAngle);