libGDX Box2DDebugRenderer 绘制框太大和太小

libGDX Box2DDebugRenderer Draw Box Too Big & Too Small

所以,我只想绘制 Box2DDebugRenderer 与精灵大小相同。 我使用了相同的 SpriteBatch 相同的 Camera 和相同的 Viewport。我花了 8 个小时,尝试了 google 左右的解决方案,但仍然没有解决问题。

这是我得到的:

我只是更改了这一行:

PolygonShape shape = new PolygonShape();
shape.setAsBox(32, 32);

一些教程对 div 说 2。我试过我得到的结果像第二张图片。

这是我的脚本

PlayScreen.java:

public class PlayScreen implements Screen {
    private SpriteBatch batch;
    private TiledMap tileMap;
    private TiledMapRenderer tiledMapRenderer;
    private OrthographicCamera cam;
    private Player player;
    private World world;
    private Box2DDebugRenderer debugRenderer;
    private FitViewport gamePort;

    public PlayScreen(HookaHookaGame game) {
        this.batch = game.getSpriteBatch();
        this.world = new World(new Vector2(0, -20), true);

        // Create cam
        cam = new OrthographicCamera();
        gamePort = new FitViewport(800, 600, cam);
        gamePort.apply(true);

        //initially set our gamcam to be centered correctly at the start of of map
        // cam.position.set(400, 300, 0);
        // cam.update();

        // Load tilemap
        tileMap = new TmxMapLoader().load("simulation01.tmx");
        tiledMapRenderer = new OrthogonalTiledMapRenderer(tileMap, batch);

        // Create box2d debug renderer
        debugRenderer = new Box2DDebugRenderer();

        // Create player sprite
        player = new Player(this.world);
    }

    @Override
    public void show() {

    }

    @Override
    public void render(float delta) {
        //cam.update();

        // Update sprite
        player.update(delta);

        //Clear the game screen with Black
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // Draw tilemap
        tiledMapRenderer.setView(cam);
        tiledMapRenderer.render();

        // Set camera to spritebatch
        batch.setProjectionMatrix(cam.combined);
        // Draw sprite
        batch.begin();
        batch.draw(player.getKeyFrame(), 300, 300);
        player.draw(batch);
        batch.end();

        // Draw box2d debug renderer
        debugRenderer.render(world, cam.combined);
    }

    @Override
    public void resize(int width, int height) {
        gamePort.update(width, height);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {

    }
}

Player.java,从 Sprite Class:

扩展而来
public class Player extends Sprite {
    private Animation anim;
    private float stateTimer;
    private World world;
    private Body body;

    // Debug
    public Player(World world) {
        stateTimer = 0;
        this.world = world;

        loadAnim();
    }

    private void loadAnim() {
        Array<TextureRegion> temp = new Array<TextureRegion>(40);

        Texture texture = new Texture("sprite.png");
        temp.add(new TextureRegion(texture, 3*32, 3*32, 32, 32));
        temp.add(new TextureRegion(texture, 2*32, 3*32, 32, 32));
        temp.add(new TextureRegion(texture, 32, 3 * 32, 32, 32));
        temp.add(new TextureRegion(texture, 0, 3*32, 32, 32));

        anim = new Animation(0.1f, temp, Animation.PlayMode.LOOP);

        BodyDef bodyDef = new BodyDef();
        bodyDef.position.set(100, 100);
        bodyDef.type = BodyDef.BodyType.DynamicBody;
        body = world.createBody(bodyDef);

        PolygonShape shape = new PolygonShape();
        shape.setAsBox(32, 32);

        FixtureDef fixture = new FixtureDef();
        fixture.shape = shape;

        body.createFixture(fixture);

        setBounds(0, 0, 32, 32);
        setPosition(100, 100);
    }

    public void update(float delta) {
        stateTimer += delta;

        setRegion(getKeyFrame());
        setSize(32, 32);
    }

    public TextureRegion getKeyFrame() {
        return anim.getKeyFrame(stateTimer, true);
    }
}

你能解释一下到底发生了什么吗?

Box2d 和 Textures 来源不同。

物体的原点是它的中心。

纹理的原点是左下角。

如您所见,如果将它们绘制在同一位置,则 box2d 对象的中心恰好位于纹理的左下角。

伪代码:

batch.draw(texture, body.x - texture.width / 2, body.y - texture.heigth / 2);

否则,您可以将 box2d 主体的原点设置为 "the bottom left corner",但如果您按照其他教程进行操作,这可能会给您带来麻烦。

您还可以在绘制精灵之前通过调用精灵的 setOriginCenter() 函数将精灵的原点置于中心

所以 spritebatch 会像你的盒子一样从中心绘制它们