body 在任何重力下缓慢下落

body falls slowly in any gravity

我创建了一个具有地球引力的世界,我在场景中放置了一个实体(包含一个精灵和一个 Body),它像气球一样慢慢落下。

这是我设置世界的方式:

world = new World(new Vector2(0, -GRAVITY_EARTH), true);

这里是 Body 等的相关 Box2D 代码:

BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(positionX, positionY);

// Create our body in the world
body = world.createBody(bodyDef);

// Grab the first idle sprite to use as initial
Sprite sprite = idleSprites.get(0);

// Create a box shape to represent our hit box
PolygonShape box = new PolygonShape();
box.setAsBox(sprite.getWidth() / 2f, sprite.getHeight() / 2f);

// Create a fixture definition to apply our shape
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1f; // Give it full density
fixtureDef.friction = 0f; // Give it no friction
fixtureDef.restitution = 0f; // Make it not bouncy

// Create our fixture and attach it to the body
fixture = body.createFixture(fixtureDef);

// Remember to dispose of any shapes after you're done with them!
// BodyDef and FixtureDef don't need disposing, but shapes do.
box.dispose();

以及我如何绘制精灵:

TextureRegion keyFrame = idleAnimation.getKeyFrame(stateTimeSeconds, true);
Vector2 position = body.getPosition();
batch.draw(keyFrame, position.x - keyFrame.getRegionWidth() / 2f, position.y -   keyFrame.getRegionHeight() / 2f);

以及render()方法中的相关代码:

@Override
public void render () {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    final float deltaTime = Gdx.graphics.getDeltaTime();

    camera.update();
    spriteBatch.setProjectionMatrix(camera.combined);

    spriteBatch.begin();
    spriteBatch.draw(sky, 0, 0);
    tim.animate(spriteBatch, deltaTime);
    spriteBatch.draw(floor, 0, 0);
    spriteBatch.end();

    // Render physics for debug
    debugRenderer.render(world, camera.combined);

    // Run physics
    doPhysicsStep(deltaTime);
}

private void doPhysicsStep(float deltaTime) {
    // fixed time step
    // max frame time to avoid spiral of death (on slow devices)
    float frameTime = Math.min(deltaTime, 0.25f);
    accumulator += frameTime;
    while (accumulator >= TIME_STEP) {
      world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
      accumulator -= TIME_STEP;
    }
 }

我试过改变灯具的密度,我试过改变重力值,我试过改变 TIME_STEP 但没有任何效果。 body就像气球一样缓缓落下

在我看来,您正在使用像素作为单位,box2d 将每个单位都视为米,因此您达到了每个时间步长 2.0 个单位的内部限制,请参阅 http://www.iforce2d.net/b2dtut/gotchas。您可以通过以世界单位而不是像素设置相机来解决这个问题,但是您必须缩放所有精灵和位置以适应世界单位而不是像素。

像这样的事情可能会做:

float w = (float) Gdx.graphics.getWidth();
float h = (float) Gdx.graphics.getHeight();
camera = new OrthographicCamera(30, 30 * (h / w));

此处设置相机的方式允许视口的高度根据屏幕的纵横比可变。

然后设置 sprite 按设置的系数更改它

sprite.setSize(sprite.getWidth / PIX2M, sprite.getHeight / PIX2M);

其中 PIX2M 是一个静态字段,定义了 box2d 中一米有多少个像素

或者,您可以将 sprite 的尺寸明确设置为一个具有物理意义的值,并与原始图像的纵横比(我个人的偏好)。因此,例如 100 x 500 的人物图像可以这样设置。

sprite.setSize(.4f, 2f);

表示此人高 2 米,宽 .4 米。此外,使用此方法,您不需要 PIX2M 转换因子,并且您将始终知道 body 的确切大小。由于您将相机设置为特定数量的世界单位,在这种情况下为 30,因此无论显示器的分辨率如何,精灵都会在屏幕上占据相同数量的空间。