Libgdx 单位转换Box2D,结果怪异

Libgdx 单位转换Box2D,结果怪异,libgdx,box2d,Libgdx,Box2d,我正在使用LibGDX并试图学习box2D,但是这个单位转换让我困惑,我想:我得到了一个256x256像素的图像,想要创建一个表示这个图像的实体,使用1:32的比例,所以每次我想要将值传递到box2D比例,我必须将它除以32或乘以1/32,这是相同的等式,每次我想从这个世界得到像素级的值,我必须将它乘以32,但问题仍然是一样的:不能得到好的模拟,我会把我的代码放在这里,让你看看我是怎么做的。我也会把变量放在这里,这样你就可以按ctrl+c和ctrl+v: private SpriteBa

我正在使用LibGDX并试图学习box2D,但是这个单位转换让我困惑,我想:我得到了一个256x256像素的图像,想要创建一个表示这个图像的实体,使用1:32的比例,所以每次我想要将值传递到box2D比例,我必须将它除以32或乘以1/32,这是相同的等式,每次我想从这个世界得到像素级的值,我必须将它乘以32,但问题仍然是一样的:不能得到好的模拟,我会把我的代码放在这里,让你看看我是怎么做的。我也会把变量放在这里,这样你就可以按ctrl+c和ctrl+v:

    private SpriteBatch batch;
    private ShapeRenderer srender;
    private Texture img;

    private World world;
    private Body bad, bridge;

    private OrthographicCamera cam, cam2;

    private Box2DDebugRenderer render;
@Override
public void create () {
        srender = new ShapeRenderer();
        batch = new SpriteBatch();
        img = new Texture("badlogic.jpg");

        cam = new OrthographicCamera(500f, 500f);
        cam.translate(250f, 250f);
        cam.update();

        //Used to draw the box2D world scaled to the pixels size
        cam2 = new OrthographicCamera(500 * 0.03125f, 500 * 0.03125f);
        cam2.translate(250f * 0.03125f, 250f * 0.03125f);
        cam2.update();

        render = new Box2DDebugRenderer();
        world = new World(new Vector2(0f, -10f), true);

        BodyDef bdef = new BodyDef();
        bdef.type = BodyType.DynamicBody;
        bad = world.createBody(bdef);

        PolygonShape pshape = new PolygonShape();
        pshape.setAsBox(img.getWidth() * 0.03125f, img.getHeight() * 0.03125f);

        FixtureDef fdef = new FixtureDef();
        fdef.shape = pshape;
        bad.createFixture(fdef);

        /*Criando a ponte*/
        bdef.type = BodyType.StaticBody;
        bridge = world.createBody(bdef);

        pshape.setAsBox(500f * 0.03125f, 5f * 0.03125f);
        bridge.createFixture(fdef);

        bad.setTransform(new Vector2(250f * 0.03125f, 500f * 0.03125f) , 0);
        bridge.setTransform(new Vector2(250f * 0.03125f, 0f * 0.03125f), 0);

        batch.setProjectionMatrix(cam.combined);
        srender.setProjectionMatrix(cam.combined);
    }

@Override
public void render () {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(img, (bad.getPosition().x - img.getWidth()/2 * 0.03125f) * 32, 
                            (bad.getPosition().y - img.getHeight()/2 * 0.03125f) * 32);
            batch.end();

            render.render(world, cam2.combined);

            srender.begin(ShapeRenderer.ShapeType.Filled);
            srender.circle(250f, 500f, 5f);
            srender.circle(250f, 0f, 5f);
            srender.end();

            world.step(1/60f, 6, 2);
}
如果您运行此代码,您将看到创建的框仍然不适合图像大小,图像停止在屏幕中间移动,而它应该只停止在底部,这里有人可以帮助我吗?谢谢你的关注


Ps:我已经听说过要更改视口,但我仍在尝试学习这种转换,之后我会去寻找视口。

看看你真的应该看看@Xoppa的博客。不幸的是,有些教程使用某种像素到单位的转换。但是libgdx已经有了一个工具来为您实现这一点:Viewport。因此,与其自己转换像素,不如让视口为您转换像素!