LibGdx Box2d collison 与 sprite 不匹配

LibGdx Box2d collison not matching up with sprite

我正在为大学制作游戏 class。当我的主角(树)撞到地面时,它停在离地面不远的地方

screenshot 1

当玩家降落在小平台上时,差距更大

screenshot 2

我创建角色和地面的 body 的代码是这个

public static Body createBody(int x, int y, float width, float height, boolean isStatic){
        Body body;

        BodyDef def = new BodyDef();

        if(isStatic){
            def.type = BodyDef.BodyType.StaticBody;
        }
        else {
            def.type = BodyDef.BodyType.DynamicBody;
        }


        def.position.set(x / PPM , y / PPM);

        // returns a World object    
        body = GlobalWorld.getInstance().createBody(def);

        PolygonShape shape = new PolygonShape();

        shape.setAsBox(width / 2 / PPM, height / 2 / PPM);

        body.createFixture(shape, 1.0f);

        shape.dispose();
        return body;
}

地面的代码在它自己的class

public class Material {
    private Texture image;
    private Body body;
    private Sprite sprite;

    public Material(Texture t, int x, int y, int w, int h){
        image = t;
        sprite = new Sprite(t);
        body = BoxBuilder.createBody(x, y, w, h, true);
        body.setUserData("Ground");
    }

    public void draw(){
        // returns a SpriteBatch
        SpriteBatch batch = GlobalBatch.getInstance();
        sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);
        batch.begin();
        sprite.draw(batch);
        batch.end();
    }

    public void dispose(){
        image.dispose();
    }
}

绘制地面的代码

public void draw(){
     for(Material m : worldObjects){
        m.draw();
     }
}

我画人物的代码

public void create(){
    // do stuff

    // global vars
    body = createBody(0, 480, 313, 260, false);

    texture = new Texture("tree.PNG");
    sprite = new Sprite(texture);

    // do stuff
}

public void render(){
    // do stuff
    sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);
    batch.begin()
    sprite.draw(batch)
    batch.end()
    // do stuff
}

PPM(每米像素)为

public static final float PPM = 32;

我不知道这里有什么问题,我想让角色降落在地面上,而不是降落在地面上。因此,如果有人能告诉我是什么原因造成的,或者给我指点一个很好的教程来学习更多关于 box2d 的信息,我将不胜感激。

当我们使用 PolygonShape 创建主体时,主体位于该多边形的中心,因此当使用主体位置绘制时,它从 PolygonShape 的中心开始绘制,因此我们需要在左下角绘制.

Materialclass

替换

sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);

sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2,body.getPosition().y-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);

并且对于字符绘制也改变

sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);

sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2, body.getPosition().y*PPM-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);

正如我在您的代码中看到的,您没有在 Material class 中设置 Sprite 的大小,也没有为字符设置宽度和高度。

在MaterialClass

sprite = new Sprite(t);
sprite.setSize(w,h); 

对于角色

body = createBody(0, 480, 313, 260, false);
texture = new Texture("tree.PNG");
sprite = new Sprite(texture);
sprite.setSize(313,260);