2014-09-26 67 views
0

我創建了Box2D的繩子與RevoluteJointRopeJoint但我有幾個問題是:如何構建並繪製一個漂亮的繩子Box2D的

  1. 不時,最後一段旋轉,它看起來就像它從繩子上斷開一樣。
  2. 如何繪製這個東西?我用每個鏈接的大小創建一個紋理。如果繩子沒有移動,它看起來不錯,但只要繩子移動,不同的鏈接開始輕微旋轉,你會看到鏈接之間的差距。

代碼:

private void createChain(World world, Body anchorBody) { 
    Body previousBody = anchorBody; 

    FixtureDef fixtureDef = new FixtureDef(); 

    PolygonShape robeLinkShape = new PolygonShape(); 
    robeLinkShape.setAsBox(4/PPM, 8/PPM); 
    fixtureDef.shape = robeLinkShape; 
    fixtureDef.density = 0.1f; 
    // fixtureDef.friction = 1.0f; 
    fixtureDef.restitution = 0.1f; 
    fixtureDef.filter.maskBits = Box2DConst.BIT_PLAYER; 
    fixtureDef.filter.categoryBits = Box2DConst.BIT_GROUND; 

    float mapX = anchorBody.getPosition().x * PPM; 
    float mapY = anchorBody.getPosition().y * PPM; 

    BodyDef bodyDef = new BodyDef(); 
    bodyDef.angularDamping = 1.0f; 
    bodyDef.linearDamping = 1.0f; 

    //create rope 
    for (int i = 0; i < 10; i++) { 
    Float robeX = mapX/PPM; 
    Float robeY = (mapY - (i * 16))/PPM; 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 
    bodyDef.position.set(robeX, robeY); 

    final Body link = world.createBody(bodyDef); 
    link.createFixture(fixtureDef); 

    RevoluteJointDef jointDef = new RevoluteJointDef(); 
    jointDef.initialize(previousBody, link, new Vector2(robeX, robeY)); 

    //don't need the rope to collide itself 
    jointDef.collideConnected = false; 
    jointDef.enableLimit = false; 

    // because we don't collide with other bodies in the rope, limit rotation to keep the rope bodies from rotating too much. 
    jointDef.lowerAngle = -5.0f * MathUtils.degreesToRadians; 
    jointDef.upperAngle = 5.0f * MathUtils.degreesToRadians; 
    world.createJoint(jointDef); 

    links.add(link); 
    previousBody = link; 
    } 

    RopeJointDef ropeJointDef = new RopeJointDef(); 
    ropeJointDef.localAnchorB.set(0, 0); 
    ropeJointDef.maxLength = 90.0f; 
    ropeJointDef.bodyB = previousBody; 
    ropeJointDef.bodyA = links.get(0); 
    ropeJointDef.collideConnected = false; 
    world.createJoint(ropeJointDef); 
} 

public void draw(final SpriteBatch batch) { 
    Texture texture = FipiGame.res.get("rope"); 
    batch.begin(); 
    for (Body link : links) { 
    float x = (link.getPosition().x * PPM) - 4; 
    float y = (link.getPosition().y * PPM) - 8; 

    float angleDeg = MathUtils.radiansToDegrees * link.getAngle(); 
    batch.draw(texture, x, y, 0, 0, texture.getWidth(), texture.getHeight(), 1f, 1f, angleDeg, 0, 0, 
      texture.getWidth(), texture.getHeight(), false, false); 
    } 
batch.end(); 
} 

回答

1

代替繪圖根據人體位置和旋轉:通過旋轉接頭位置循環(anchorA和anchorB的中點在世界空間)創建一組點。然後繪製你的精靈,讓它們連接這些位置。這會有些不準確,因爲它不會完全符合剛體的位置,但它應該看起來沒問題。

+0

我會試試這個,但是我不需要考慮旋轉嗎?啊,我明白了,你的意思是你繪製出精靈,以便「接觸」兩點。然後,精靈將與繩子的彎曲對齊...(以某種方式說話) – morpheus05 2014-09-27 09:09:18

+0

是的。你需要找到連接點的線的角度。你可以旋轉精靈,使x軸與繩子一致。然後設置精靈的scaleX,以便它延伸連接點。 – DylanVann 2014-09-27 18:03:18