Java LibGdx Box2d collison与sprite不匹配

Java LibGdx Box2d collison与sprite不匹配,java,android,libgdx,box2d,Java,Android,Libgdx,Box2d,我正在制作一个游戏,作为一个大学班级的项目。当我的主角(树)落地时,它会在离地不远的地方停下来 public void draw(){ for(Material m : worldObjects){ m.draw(); } } 当玩家降落在小平台上时,差距会更大 我创建角色和背景的代码如下 public static Body createBody(int x, int y, float width, float height, boolean isSt

我正在制作一个游戏,作为一个大学班级的项目。当我的主角(树)落地时,它会在离地不远的地方停下来

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

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

我创建角色和背景的代码如下

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;
}
地面的代码在它自己的类中

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(每米像素数)为


我不知道这里有什么问题,我想让角色降落在地面上,而不是降落在上面。因此,如果有人能告诉我是什么导致了这种情况,或者给我一个好的教程,让我学习更多关于box2d的知识,我将不胜感激。

当我们使用
多边形形状创建实体时,实体位于多边形的中心,所以当使用实体位置绘制时,它开始从
多边形形状的中心绘制,所以我们需要在左侧绘制下角

材料中

替换

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

而对于角色绘制也会发生变化

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


正如我在代码中看到的,您没有在
材质
类中设置
精灵的大小,也没有为角色设置宽度和高度

材料类

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);

可能画布的大小比图像大。确保画布和图像的高度相等。地面是由不可分割的瓷砖组成的,libgdx不是替我照看画布吗?我不知道你的建议是什么意思使用
box2debugrenderer
检查身体的界限。
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);