使用LibGDX进行不精确的Box2d坐标

时间:2014-03-06 00:25:15

标签: android libgdx box2d

我正在使用LibGDX和Box2d构建我的第一款Android游戏。耶!

但是我遇到了Box2d的一些严重问题。

我有一个简单的舞台,底部有一个长方形的Box2d,代表地面,左边和右边的另外两个矩形Box2d,代表墙壁。

A Screenshot

Another Screenshot

我也有一个盒子。可以触摸此框并使用applyLinearImpulse移动它,就像它被踢了一样。这是一个DynamicBody。

在Box对象的draw()代码中,Box对象的Box2d主体给出了一个错误的X轴值。 Y轴的值很好。

屏幕截图上的那些蓝色“点”是我在body.getPosition()给我的框边上打印的小纹理。请注意,在一个屏幕截图中,点与实际的DebugRenderer矩形对齐,而另一个则不是。

这就是发生的事情:当盒子移动时,移动中的对齐就会丢失。

框,地面和墙壁之间的碰撞恰好考虑到DebugRenderer渲染的区域。但是body.getPosition()和fixture.testPoint()会考虑那些蓝点内的区域。

所以,不知何故,Box2d正在为同一个机构“维持”这两个区域。

我认为这可能是我的像素和米的转换之间的某种“精度损失”(我缩放了100倍),但是Y轴使用了相同的技术而且很好。

所以,我认为我可能会遗漏一些东西。

修改1

我正在从Box坐标转换为世界坐标。如果您在屏幕截图中看到蓝色调试精灵,它们几乎完美地形成了框。

public static final float WORLD_TO_BOX = 0.01f;
public static final float BOX_TO_WORLD = 100f;

框呈现代码:

public void draw(Batch batch, float alpha) {
    x = (body.getPosition().x - width/2) * TheBox.BOX_TO_WORLD;
    y = (body.getPosition().y - height/2) * TheBox.BOX_TO_WORLD;

    float xend = (body.getPosition().x + width/2) * TheBox.BOX_TO_WORLD;
    float yend = (body.getPosition().y + height/2) * TheBox.BOX_TO_WORLD;

    batch.draw(texture, x, y);
    batch.draw(texture, x, yend);
    batch.draw(texture, xend, yend);
    batch.draw(texture, xend, y);
}

修改2

我开始怀疑相机了。我得到了DebugRenderer和一个scene2d舞台。这是代码:

我的屏幕分辨率(Nexus 5,它的肖像):

public static final int SCREEN_WIDTH = 1080;
public static final int SCREEN_HEIGHT = 1920;

在创业时:

// ...
    stage = new Stage(SCREEN_WIDTH, SCREEN_HEIGHT, true);

    camera = new OrthographicCamera();
    camera.setToOrtho(false, SCREEN_WIDTH, SCREEN_HEIGHT);

    debugMatrix = camera.combined.cpy();
    debugMatrix.scale(BOX_TO_WORLD, BOX_TO_WORLD, 1.0f);
    debugRenderer = new Box2DDebugRenderer();
// ...

现在,render()代码:

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

    camera.update();

    world.step(1/45f, 6, 6);
    world.clearForces();

    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();

    debugRenderer.render(world, debugMatrix);
}

1 个答案:

答案 0 :(得分:1)

看起来那个答案很简单:

    stage.setCamera(camera);

我没有将OrthographicCamera设置到舞台上,因此舞台使用了某种与我的东西不对齐的默认相机。

最终它与Box2d无关。 Box2d返回健康值,但由于错误的舞台分辨率,这些值对应于我的屏幕中的错误位置。