2014-09-26 69 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