繁体   English   中英

如何用box2d绘制漂亮的绳索

[英]How to construct and draw a nice rope with box2d

我用RevoluteJointRopeJointRevoluteJoint创建了一条绳索,但是我有几个问题:

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

而不是根据身体的位置和旋转进行绘制:通过遍历旋转关节位置(世界空间中的anchorA和anchorB的中点)来创建一组点。 然后绘制您的精灵,使它们连接这些位置。 这将有些不准确,因为它不会与刚体的位置完美对齐,但看起来应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM