2016-07-05 2 views
0

Я создаю веревку серии Box2D тел со следующим кодом:Box2D LibGDX вопрос Rope

public void create(float length, float ropeLength){ 
    Array<Body> bodies = new Array<Body>(); 
    bodies.add(BodyFactory.createBox(world, position.x, position.y, length, length, BodyType.StaticBody, 0, 0, 0, "RopeMain")); 

    for(int i = 1; i < ropeLength; i++){ 
     bodies.add(BodyFactory.createBox(world, position.x, position.y - (((length/2)/Core.PPM) * i), 
       length, length, BodyType.DynamicBody, 0, 0, 0, "RopeBody" + i)); 

     RopeJointDef rDef = new RopeJointDef(); 
     rDef.bodyA = bodies.get(i - 1); 
     rDef.bodyB = bodies.get(i); 
     rDef.collideConnected = true; 
     rDef.maxLength = (length/2)/Core.PPM; 
     rDef.localAnchorA.set(position.x, -((length/2)/Core.PPM)); 
     rDef.localAnchorB.set(position.x, ((length/2)/Core.PPM)); 
     world.createJoint(rDef); 
    } 
} 

Позвольте мне поделиться некоторыми параметрами ...

Для BodyFactory.createBox это необходимо следующее:

мир, XPOS, YPOS, ширина, высота кузова, плотность, трения, реституция, крепеж пользовательские данные. (длина такой же, так как он использует коробки)

Core.PPM - это пиксели на метр. Также обратите внимание, что позиция делится на PPM в конструкторе.

Вопрос: Почему следующие линии стреляют вправо?

enter image description here

Любая информация очень полезна, и как будет плотность, трение и реституция влияют на веревку? Благодаря!

ответ

1

Соединительный элемент localAnchor относится к к центру кузова и не является абсолютным значением. Это означает, что если вы хотите установить соединение с центром нижней из bodyA и центра верхней из bodyB вам нужно использовать

rDef.localAnchorA.set(0, -((length/2)/Core.PPM)); 
    rDef.localAnchorB.set(0, ((length/2)/Core.PPM)); 
+0

Абсолютно спасибо! – Luke