2011-08-24 5 views
0

J'ai essayé d'utiliser un MouseJoint pour déplacer une pièce partout où l'utilisateur touche. Mais la pièce, affectée par l'articulation, se comporte bizarrement, n'atteignant jamais le point. Voici le code (x et y sont déjà converties en unités « physiques »):MouseJoint ne fonctionne pas correctement

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)); 
} 

Je cherchais un moyen d'établir le point d'ancrage dans le BodyB, comme le « comportement étrange » que je l'ai mentionné semble faire en sorte que le corps gravite autour du point établi (une orbite deux fois la largeur de l'objet), comme si le point d'ancrage était à l'extérieur du corps (en forme d'hexagone, btw). Mais je ne vois aucun moyen de le faire dans libgdx.

Est-ce que quelqu'un sait ce que je fais mal? Merci d'avance!

Répondre

0

Eh bien, MouseJoint fonctionnait correctement, j'ai juste mal compris comment MouseJoint fonctionne.

Comme cela est clairement visible dans le banc d'essai Box2d, MouseJoint est utilisé pour faire glisser après avoir sélectionné un objet. Par conséquent, l'ancre est affectée dans le premier target.set. Comme je voulais déplacer le centre de l'objet à l'endroit où la souris était (ou l'utilisateur a touché), un mj_def.target.set(body.getPosition().x + 2.0f, body.getPosition().y + 1.0f); (l'objet est 4.0f par 2.0f) dans l'initialisation a résolu le problème. En outre, il peut ne pas être le meilleur conjoint pour mes intentions (pour déplacer un objet spécifique à un endroit dans l'écran).