JBox2d JavaFx MouseJoint создание лага - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать небольшую игру, чтобы попробовать некоторые физические вещи в java. Для этого я использую JBox2d в качестве физического движка для расчета столкновений и рисования его с помощью javafx. На данный момент я хорошо понимаю, как работает JBox2d, но столкнулся с проблемой. Игра представляет собой простую платформу, которую пользователь может контролировать и перемещать sh вокруг шариков, заставляя их отскакивать от него.

//mouse joint ground shape
PolygonShape ground_shape = new PolygonShape;
ground_shape.setAsBox(1, 1);
BodyDef ground_bodydef = new BodyDef();
ground_bodydef.type = BodyType.STATIC;
Body ground = Utils.world.createBody(ground_bodydef);
ground.createFixture(ground_shape, 0);

// mouse joint
MouseJointDef mouse_jointdef = new MouseJointDef();
mouse_jointdef.bodyA = ground;
mouse_jointdef.bodyB = (Body) plat.node.getUserData();
mouse_jointdef.dampingRatio = 0.5f;
mouse_jointdef.collideConnected = true;
mouse_jointdef.maxForce = 500;
mouse_jointdef.frequencyHz = 5.0f;
MouseJoint mouse_joint = (MouseJoint) Utils.world.createJoint(mouse_jointdef);

Это созданное мышиное соединение с использованием JBox2d.

EventHandler<MouseEvent> mouseEvent = new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        Body body_p = (Body) plat.node.getUserData();
        float Xmouse = (float) mouseEvent.getX();
        float Ymouse = (float) mouseEvent.getY();
        Vec2 vec = new Vec2(Utils.toPosX(Xmouse), Utils.toPosY(Ymouse));
        mouse_joint.setTarget(vec);
        //body_p.setTransform(vec, 0);
    }
};
scene.setOnMouseMoved(mouseEvent);

Это код средства обновления для установки объединенной цели в месте расположения мыши.

EventHandler<ActionEvent> ae = new EventHandler<ActionEvent>() {
    public void handle(ActionEvent t) {
        //Create time step. Set Iteration count 8 for velocity and 3 for positions           
        Utils.world.step(1.0f/60.f, 8, 3);
        //Move balls to the new position computed by JBox2D
        Body body_p = (Body)plat.node.getUserData();

        float xpos_p = Utils.toPixelPosX(body_p.getPosition().x);
        float ypos_p = Utils.toPixelPosY(body_p.getPosition().y);
        plat.node.setLayoutX(xpos_p - Platform.width/2);
        plat.node.setLayoutY(ypos_p - Platform.height/2);
        for (int i=0; i < ballTEST.size(); i++){
            Body body_b = (Body)ballTEST.get(i).node.getUserData();
            float xpos = Utils.toPixelPosX(body_b.getPosition().x);
            float ypos = Utils.toPixelPosY(body_b.getPosition().y);
            ballTEST.get(i).node.setLayoutX(xpos);
            ballTEST.get(i).node.setLayoutY(ypos);
        }
    }
};

Этот код используется для перемещения объектов по экрану.

Проблема лежит с созданием сустава в мире. Всякий раз, когда это делается, вся программа запускается со скоростью примерно 0,3 кадра в секунду. Когда я полностью игнорирую соединение мыши и просто напрямую переводю платформу на мышь, она работает нормально (хотя это нарушает физику столкновения с шариками). Кто-нибудь знаком с использованием этого порта java для Box2d, который имеет какой-либо опыт работы с суставами мыши, потому что я не могу выяснить, почему это вызывает эту задержку.

...