Соединение шкива отскакивает и замедляет мир

Строка json анализируется и значения передаются в соответствующие классы Java.
no-args конструктор вызывается для каждого объекта, как я использую Gson,
Я тогда звоню pulley.init(world); на самом деле добавить объект в мир.

Проблема в том, что объекты анализируются и загружаются в мир Box2d.
Pulley присутствует, есть 2 коробки с линией, соединяющей их.
Когда сцена загружена, шкив медленно падает с неба.
Затем он внезапно выпрыгивает из поля зрения, и весь мир становится ужасно медленным.
Это настройка правильно для Pulley совместный? Я не знаю, почему сустав вылетает из поля зрения и вызывает это ухудшение качества.

определение объекта json..

"pulleys":[
    {
        "anchorA_Low": 2.0,
        "anchorB_Low": 2.0,
        "anchorA_High": 10.0,
        "anchorB_High": 10.0,
        "ratio": 2.0,
        "shapeA": {
            "position": {
                "x": -30.0,
                "y": 10.0
            },
            "angle": 0.0,
            "width": 1.0,
            "height": 1.0,
            "bodyType": "DYNAMIC",
            "density": 5.0,
            "friction": 0.0,
            "restitution": 0.0,
        },
        "shapeB": {
            "position": {
                "x": -10.0,
                "y": 10.0
            },
            "angle": 0.0,
            "width": 1.0,
            "height": 1.0,
            "bodyType": "DYNAMIC",
            "density": 5.0,
            "friction": 0.0,
            "restitution": 0.0,
        }
    }
]

Класс Java для Pulley объект.

public class Pulley extends Joint{

    private Vec2 groundAnchorA;
    private Vec2 groundAnchorB;
    private Vec2 anchorA;
    private Vec2 anchorB;   
    private float anchorA_Low;
    private float anchorB_Low;
    private float anchorA_High;
    private float anchorB_High;
    private float ratio;

    public Pulley() {}

    public void init(World world){

            Body bodyA = getShapeA().setupShape(world);
            Body bodyB = getShapeB().setupShape(world);

            IAEdge edge = new IAEdge(bodyA.getPosition(), bodyB.getPosition());
            edge.init(world);

            anchorA = new Vec2(bodyA.getPosition().x, bodyA.getPosition().y + anchorA_Low);
            anchorB = new Vec2(bodyB.getPosition().x, bodyB.getPosition().y + anchorB_Low);

            groundAnchorA = new Vec2(bodyA.getPosition().x, bodyA.getPosition().y + anchorA_Low + anchorA_High);
            groundAnchorB = new Vec2(bodyB.getPosition().x, bodyB.getPosition().y + anchorB_Low + anchorB_High);

            PulleyJointDef pulleyDef = new PulleyJointDef();
            pulleyDef.initialize(bodyA, bodyB, groundAnchorA, groundAnchorB, anchorA, anchorB, ratio);
            world.createJoint(pulleyDef);
    }

    public Body setupShape(World world){

        PolygonShape blockShape = new PolygonShape();
        blockShape.setAsBox(getWidth() / 2, getHeight() / 2);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = blockShape;
        fixtureDef.density = getDensity();
        fixtureDef.friction = getFriction();
        fixtureDef.restitution = getRestitution();

        BodyDef bodydef = new BodyDef();
        bodydef.type = BodyType.valueOf(getBodyType());
        bodydef.position.set(getPosition().x, getPosition().y);
        bodydef.angle = getAngle();

        Body body = world.createBody(bodydef);
        body.createFixture(fixtureDef);

        return body;
    }
}

Java-класс для инкапсуляции EdgeShape в Box2d.

public class IAEdge {

    private Vec2 pointA;
    private Vec2 pointB;

    public IAEdge(){}

    public IAEdge(Vec2 pointA, Vec2 pointB){

        setPointA(pointA);
        setPointB(pointB);
    }

    public Body init(Level level) {

        BodyDef bd = new BodyDef();
        Body ground = level.createBody(bd);

        bd.position.set(
            new Vec2(
                ((pointA.x + pointB.x) / 2), 
                (pointA.y + pointB.y) / 2));

        EdgeShape shape = new EdgeShape();
        shape.set(
            new Vec2(pointA.x, pointA.y), 
            new Vec2(pointB.x, pointB.y));

        ground.createFixture(shape, 0.0f);

        return ground;
    }
}

1 ответ

Решение

Это была ошибка в jbox2d, фиксируется в 2.3.1-SNAPSHOT

Другие вопросы по тегам