身体在任何重力下都会缓慢下降

时间:2015-02-02 19:27:34

标签: libgdx box2d

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

以下是我设置世界的方式:

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,但没有任何效果。身体像气球一样缓缓下落。

1 个答案:

答案 0 :(得分:2)

在我看来,您使用像素作为单位,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.setSize(sprite.getWidth / PIX2M, sprite.getHeight / PIX2M);

其中PIX2M是一个静态字段,用于定义box2d中仪表的像素数

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

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

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