【发布时间】:2014-03-06 00:25:14
【问题描述】:
我正在使用 LibGDX 和 Box2d 构建我的第一个 Android 游戏。耶!
但我在使用 Box2d 时遇到了一些严重问题。
我有一个简单的舞台,底部的矩形 Box2d 主体代表地面,左右两侧的另外两个矩形 Box2d 主体代表墙壁。
我也有一个盒子。可以触摸此框并使用 applyLinearImpulse 移动它,就像它被踢一样。它是一个 DynamicBody。
发生的情况是,在我的 Box 对象的 draw() 代码中,Box 对象的 Box2d 主体给了我一个错误的 X 轴值。 Y 轴的值很好。
屏幕截图上的那些蓝色“点”是我打印在 body.getPosition() 给我的盒子边缘上的小纹理。请注意,在一个屏幕截图中,这些点是如何与实际的 DebugRenderer 矩形对齐的,而在另一个屏幕截图中却不是。
这是正在发生的事情:当盒子移动时,对齐会在移动中丢失。
考虑到 DebugRenderer 渲染的区域,盒子、地面和墙壁之间的碰撞恰好发生。但是 body.getPosition() 和 fixture.testPoint() 会考虑那些蓝点内的区域。
因此,不知何故,Box2d 为同一个主体“维护”了这两个区域。
我认为这可能是我的像素和米转换之间的某种“精度损失”(我将缩放 100 倍),但 Y 轴使用相同的技术,这很好。
所以,我想我可能会遗漏一些东西。
编辑 1
我正在从 Box 坐标转换为 World 坐标。如果您在屏幕截图中看到蓝色的调试精灵,它们几乎完美地形成了盒子。
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);
}
【问题讨论】:
-
Box2D 使用它自己的坐标系。你是在绘制之前从Box2D的坐标系转换为libGDX的坐标系吗?
-
是的,我编辑了问题。
-
我认为精度损失不是问题,因为类似的转换比例对我来说效果很好。你在用
OrthographicCamera吗? -
是的,我有一个 OrtographicCamera 设置。
-
请使用 Box2dDebugRenderer 绘制您的 box2d 主体等,不要自己动手。看看这个渲染器是否产生相同的偏移量。