Box2d libgdx,有点混淆像素到米的东西

所以我理解这个概念。 想法是box2d或多或少以米为单位工作,所以你需要从像素转换到它。 说得通。 我在这里关注box2d的教程/介绍。 它提到进行转换并为您提供一些示例使用量。 现在,这一切都很好,但我发现当我使用这些技术时,调试器框似乎没有呈现它们应该的位置。 然而,碰撞确实按预期工作。

在我的GameScreen类中,这是我如何初始化地面:

ground = new BodyDef(); // set the position half way up the ground ground.position.set(0,16 * GameScreen.WORLD_TO_BOX); groundBody = world.createBody(ground); groundShape = new PolygonShape(); // make the height 16px so it doubles to 32 groundShape.setAsBox(Gdx.graphics.getWidth() * GameScreen.WORLD_TO_BOX, 16.0f * GameScreen.WORLD_TO_BOX); groundBody.createFixture(groundShape, 0.0f); 

我在该屏幕中的渲染方法是这样的:

 public void render(float delta) { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); camera.update(); stateTime += Gdx.graphics.getDeltaTime(); batch.begin(); batch.draw(background, 0, Gdx.graphics.getHeight() - 512, 512, 512); batch.draw(trailingBackground, 512, Gdx.graphics.getHeight() - 512); int heightToCover = Gdx.graphics.getHeight() - 512; int widthToCover = Gdx.graphics.getWidth(); for(int w = 0; w < widthToCover; w += 32) { for(int h = 0; h < heightToCover; h += 32) { batch.draw(lightBackgroundTile, w, h, 32, 32); } } player.update(); player.render(stateTime, batch); batch.end(); levels.get(currentLevel).render(camera); // physics updates world.step(1/60f, 6, 2); debugRenderer.render(world, camera.combined); } 

这是播放器类的构造函数,因此您可以看到如何设置其碰撞box2d对象。 我还粘贴了在上面的渲染循环中调用的update方法来调整sprite位置。

 public Player(int x, int y, World world) { super(); playerTexture = new Texture(Gdx.files.internal("assets/hero.png")); init(x, y, 128, 128, playerTexture, false, world); bodyDef = new BodyDef(); bodyDef.type = BodyType.DynamicBody; bodyDef.position.set(x * GameScreen.WORLD_TO_BOX, y * GameScreen.WORLD_TO_BOX); body = getWorld().createBody(bodyDef); collisionBox = new PolygonShape(); collisionBox.setAsBox(32 * GameScreen.WORLD_TO_BOX, 64 * GameScreen.WORLD_TO_BOX, new Vector2(64 * GameScreen.WORLD_TO_BOX, 64 * GameScreen.WORLD_TO_BOX), 0.0f); FixtureDef fixtureDef = new FixtureDef(); fixtureDef.shape = collisionBox; fixtureDef.density = 10f; fixtureDef.friction = 0.4f; fixtureDef.restitution = 0f; body.createFixture(fixtureDef); collisionBox.dispose(); addFrame(0, 0, 128, 128); } public void update() { this.setX((int) ((body.getPosition().x) * GameScreen.BOX_TO_WORLD)); this.setY((int) ((body.getPosition().y) * GameScreen.BOX_TO_WORLD)); } 

现在,当我在各种计算,大小等中删除这些静态浮点数的乘法时,碰撞保持正确并显示调试器框。 但是将原始像素传递给box2d感觉不对。 这里有什么我不知道为什么调试盒没有显示出来的原因?

我喜欢你在做但可能会有所不同。

可能有点矫枉过正,但这是我的jucl端口

jucl / Android – pastebin

然后我只有实用程序类,即:

 public class Pixel { public static float toMeter(float pixels) { return (float)LengthConversions.Pixel2SIf(pixels); } public static Vector2 toMeter(Vector2 vecPixel) { return new Vector2(Pixel.toMeter(vecPixel.x), Pixel.toMeter(vecPixel.y)); } } public class Meter { public static final float METERS_PER_PIXEL = (float) LengthConversions.SI_PIXEL; public static float toPixel(float meter) { return (float)LengthConversions.SI2Pixelf(meter); } } 

在我的初始化中:

 int graphicsWidth = Gdx.graphics.getWidth(); int graphicsHeight = Gdx.graphics.getHeight(); CAMERA_WIDTH_METERS = Pixel.toMeter(graphicsWidth); CAMERA_HEIGHT_METERS = Pixel.toMeter(graphicsHeight); 

然后在我的游戏类中(比如你的Player类)。 在我的情况下,它是一个弹球游戏,所以我有Flipper,Ball,Bumper等。我有一个@Override render()方法,我将精灵与物理体同步。

这是一个示例文件..它很乱,但可能会有所帮助。

弹球引擎类文件