MouseJoint не работает должным образом

Я пытался использовать MouseJoint, чтобы переместить часть, куда бы ни прикасался пользователь. Но кусок, пораженный косяком, ведет себя странно, так и не дойдя до точки. Это код (x и y уже преобразованы в «физические» единицы):

MouseJointDef mj_def;
MouseJoint mj = null;
Body mj_gbody;

public void move(float x, float y)
{
    if(mj == null)
    {
        BodyDef mgbd = new BodyDef();
        mj_gbody = wrld.createBody(mgbd);
        //
        mj_def = new MouseJointDef();
        mj_def.bodyA = mj_gbody;
        mj_def.bodyB = body;
        mj_def.collideConnected = true;
        mj_def.maxForce = 20.0f * body.getMass();
        //mj_def.target.set(x,y);

        mj = (MouseJoint)wrld.createJoint(mj_def);
        body.setAwake(true);
    }

    mj.setTarget(new Vector2(x, y));
}

Я искал какой-нибудь способ установить точку привязки в BodyB, так как «странное поведение», о котором я упоминал, кажется, заставляет тело притягиваться вокруг установленной точки (орбита, вдвое превышающая ширину объекта), как если бы точка привязки был снаружи тела (шестиугольной формы, кстати). Но я не вижу способа сделать это в libgdx.

Кто-нибудь знает, что я делаю неправильно? Заранее спасибо!


person huff    schedule 24.08.2011    source источник


Ответы (1)


Ну, MouseJoint работал правильно, я просто неправильно понял, как работает MouseJoint.

Как хорошо видно на стенде Box2d, MouseJoint используется для перетаскивания после выбора объекта. Поэтому якорь назначается в первом target.set.

Поскольку я хотел переместить центр объекта в то место, где была мышь (или пользователь коснулся), mj_def.target.set(body.getPosition().x + 2.0f, body.getPosition().y + 1.0f); (объект 4.0f на 2.0f) в инициализации решил проблему. Также это может быть не самый лучший Джойнт для моих намерений (переместить конкретный объект в одно место на экране).

person huff    schedule 24.08.2011