【问题标题】:LibGdx Box2d collison not matching up with spriteLibGdx Box2d 碰撞与精灵不匹配
【发布时间】:2017-05-07 01:56:49
【问题描述】:

我正在制作一个游戏作为大学课程的项目。当我的主角(树)撞到地面时,它停在地面附近

screenshot 1

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

screenshot 2

我创建角色主体和地面的代码是这样的

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

public static final float PPM = 32;

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

【问题讨论】:

  • 可能画布尺寸比图片大。确保画布和图像的高度相等。
  • 地面是由单独的瓦片组成的,libgdx 不为我处理画布吗?我不知道你的建议是什么意思
  • 使用Box2DDebugRenderer 并检查你的身体边界。

标签: java android libgdx box2d


【解决方案1】:

当我们用PolygonShape 创建body 时,body 位于那个Polygon 的中心,所以当使用body 位置绘制时,它从PolygonShape 的中心开始绘制,所以我们需要在左下角绘制。

材料

替换

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 类中设置 Sprite 的大小,也没有为 Character 设置宽度和高度。

在材质类中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多