【问题标题】:Weird bug with Box2D shape sizesBox2D 形状大小的奇怪错误
【发布时间】:2014-07-29 03:35:00
【问题描述】:

我有一个问题。我正在使用 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 的一半。所以如果我给 hx 加上 50,它实际上是 100。

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

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

就好像我从未创建过形状或固定装置...

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

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

你猜怎么着...没什么!

然后我使用了那个确切的语句,但用 100 作为值。哇,一个大盒子!

如果我这样做:

setAsBox(99 / PPM, 100 / PPM)

我在上方(在 Y 轴上)看到一条巨线。

如果我这样做:

setAsBox(100 / PPM, 99 / PPM)

我在前面(在 X 轴上)有一条巨大的线。

所以我一开始忽略了这个问题。但是现在当我想加载一个精灵(基本上是我创建了播放器)时,形状问题阻止了我与平台发生适当的碰撞。

但令人惊讶的是,玩家精灵决定在我创建的平台中途下落并停止下落(好像发生了碰撞。这仅在 hx 和 xy 低于 100 时才会发生(因此没有盒子)。 但是如果我他们是 100 或更高,盒子就会出现并且我有适当的碰撞(除了由于盒子的大小,玩家精灵/位置在空中哈哈)。

现在为了检测玩家的碰撞,我创建了一个位于玩家下方的足部传感器。我这里也有问题。我创建了一个盒子并给它一个 Vector2 作为它的中心位置。向量 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)从平铺地图中读取对象(使用平铺地图编辑器),并使用它们制作身体和固定装置。我禁用了系统,以防它因导致错误而负责,但不,盒子仍然存在同样的问题!

顺便说一下,教程中的游戏的窗口尺寸与我的不同。但是,将它们切换到教程中的尺寸,仍然没有问题,所以这不是问题。

我做错了什么?其余代码都很好(我什至回到教程的源代码只是为了让我的代码相同)!

【问题讨论】:

    标签: java libgdx box2d


    【解决方案1】:

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

    【讨论】:

    • 我会将此标记为答案,仅当 PPM 为 int 类型时,它会产生我的问题。唯一奇怪的部分是它一直是浮点类型。在我弄乱了盒子大小之后,问题就自行解决了……
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2010-09-19
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多