gpt4 book ai didi

java - 如何使用 box2d 构建并绘制一条漂亮的绳子

转载 作者:行者123 更新时间:2023-12-01 12:29:30 26 4
gpt4 key购买 nike

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

最佳答案

不是基于 body 位置和旋转进行绘制:通过循环旋转关节位置(世界空间中 anchor A 和 anchor B 的中点)来创建一组点。然后绘制你的 Sprite ,以便它们连接这些位置。这会有些不准确,因为它不会与刚体的位置完美对齐,但看起来应该没问题。

关于java - 如何使用 box2d 构建并绘制一条漂亮的绳子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26054104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com