Box2D形状大小的奇怪错误

时间:2014-07-29 03:35:01

标签: java libgdx box2d

我有一个问题。我正在使用libGDX创建一个游戏,并且已经按照本教程进行了创建(https://www.youtube.com/watch?v=-Z_N5gHcl0k)。所以我按照教程进行,一切顺利。现在我根据我在教程中学到的内容开始一个新项目(所有内容(如相机等)已经正确设置)!

我的问题在于Box2D,我在其中为夹具添加了一个形状。

让我们说我正在制作一个盒子。

public void createBox() {
    BodyDef bdef = new BodyDef();
    FixtureDef fdef = new FixtureDef();

    bdef.position.set(200 / PPM, 500 / PPM);
    bdef.type = BodyType.DynamicBody;
    Body body = world.createBody(bdef);

    PolygonShape shape = new PolygonShape();

    shape.setAsBox(hx/ PPM, hy/ PPM);
    fdef.shape = shape;
    fdef.filter.categoryBits = B2DVars.BIT_BOX;
    fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
    body.createFixture(fdef).setUserData("box");
}

PPM等于100.它主要用于缩小Box2D中每米的像素数。

我的问题在这里:

Shape.setAsBox(hx / PPM, hy/ PPM);

hx和hy代表x的一半和y的一半。所以,如果我把50放入hx,它实际上将是100。

 shape.setAsBox(100/ PPM, 100 / PPM); <- Box

 shape.setAsBox(99/ PPM, 99/ PPM); <- No Box

好像我从未创造过形状或装置......

所以我做了一些测试。我试过了:

setAsBox(99 * 2 / PPM, 99 * 2 / PPM).

猜猜......没事!

然后我使用了那个确切的陈述,但用100作为值。 Woah一个巨大的盒子!

然后,如果我这样做:

setAsBox(99 / PPM, 100 / PPM)

我上面有一条巨线(在Y轴上)。

然后,如果我这样做:

setAsBox(100 / PPM, 99 / PPM)

我在前面得到一条巨线(在X轴上)。

所以我首先忽略了这个问题。但是现在当我想加载精灵(基本上是我创建了玩家)时,形状问题阻止了我与平台的正确碰撞。

令人惊讶的是,玩家精灵决定在我创建的平台中途摔倒并停止下降(好像发生了碰撞。只有当hx和xy低于100(因此没有框)时才会发生这种情况。 但是如果我他们已经100或者更高,那么框出现并且我有正确的碰撞(除了由于框的大小,玩家精灵/位置在空中大声笑)。

现在为了检测玩家的碰撞,我创建了一个脚踏传感器,它位于玩家的下方。我这里也有问题。我创建一个盒子,并为它的中心位置赋予它一个Vector2。 Vector 2的Y值必须为-100才能显示该框。如果它高于或低于任何值,则不会出现任何内容。 X值必须为0。

shape.setAsBox(100 / PPM, 100 / PPM, new Vector2(0, -100 / PPM), 0); <- Box

shape.setAsBox(99/ PPM, 99/ PPM, new Vector2(0, -99 / PPM), 0); <- No Box

播放器代码

private void createPlayer() {
    MapLayer layer = map.getLayers().get("Spawn");
    BodyDef bdef = new BodyDef();
    FixtureDef fdef = new FixtureDef();

    // Get X and Y coords of the playerSpawn map object
    float x = layer.getObjects().get("playerSpawn").getProperties()
            .get("x", Float.class);
    float y = layer.getObjects().get("playerSpawn").getProperties()
            .get("y", Float.class);

    // set position of body
    bdef.position.set(x / PPM, y / PPM);
    bdef.type = BodyType.DynamicBody;
    // bdef.linearVelocity.set(1f, 0);
    Body body = world.createBody(bdef);

    PolygonShape shape = new PolygonShape();

    shape.setAsBox(100 / PPM, 100 / PPM);  <- Issue code
    fdef.shape = shape;
    fdef.filter.categoryBits = B2DVars.PLAYER;
    fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
    body.createFixture(fdef).setUserData("player");

    // create foot sensor  <- Used for collision detection at players feet
    shape.setAsBox(100 / PPM, 100 / PPM, new Vector2(1, -100 / PPM), 0); <- Issue code
    fdef.shape = shape;
    fdef.isSensor = true;
    fdef.filter.categoryBits = B2DVars.PLAYER;
    fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
    body.createFixture(fdef).setUserData("foot");

    player = new Player(body);

    body.setUserData(player);

}

现在平台工作的原因是因为我使用的系统(在这里找到:http://bitbucket.dermetfan.net/libgdx-utils/wiki/Box2DMapObjectParser)从平铺地图中读取对象(使用平铺地图编辑器),并制作一个主体和夹具离开他们我通过导致错误禁用了系统,但是不行,仍然是盒子的问题!

本教程中的游戏有不同的窗口尺寸。但是,将它们切换到教程中的维度仍然没有问题,所以这不是问题。

我做错了什么?剩下的代码很好(我甚至回到教程的源代码只是为了让我的代码完全相同)!

1 个答案:

答案 0 :(得分:0)

如果您的PPM定义为100,则它具有int类型。因此,当你写99 / PPM时它实际为零,因为将整数除以整数提供了一个被截断的整数。将您的PPM更改为100.0f(因此其类型现为float