Я пытаюсь создать небольшую игру, чтобы попробовать некоторые физические вещи в 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, который имеет какой-либо опыт работы с суставами мыши, потому что я не могу выяснить, почему это вызывает эту задержку.