LibGDX Box2D:无法让 Fixture 渲染

LibGDX Box2D: Cannot get Fixture to render

我最近一直在尝试回到 LibGDX 的 Box2D 版本,我回顾了几个月前创建的演示,我的代码看起来不错,而且从我的 Google 搜索结果,我的代码很好,但对于我来说,我无法让 Fixture 呈现。

这是我的(极简主义示例)代码,对于我来说,我无法让它工作 注意:我围绕 LibGDX Game 构建了一个包装器class,应该是不言自明的

public class TestBox2D extends EGGame {

    int width;
    int height;

    static final Vector2 ZERO_GRAVITY = new Vector2(0f, 0f);

    OrthographicCamera camera;
    World world;
    Body body;
    Box2DDebugRenderer box2dDebugRenderer;
    RayHandler rayHandler;

    ... // Removed Constructor, nothing special here.

    @Override
    protected void init() {
        width = Gdx.graphics.getWidth() / 2;
        height = Gdx.graphics.getHeight() / 2;
        camera = new OrthographicCamera(width, height);
        camera.position.set(width / 2, height / 2, 0);
        camera.update();

        world = new World(ZERO_GRAVITY, true);
        box2dDebugRenderer = new Box2DDebugRenderer();
        rayHandler = new RayHandler(world);
        rayHandler.setCombinedMatrix(camera.combined);

        // creating Body
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.StaticBody;
        bodyDef.position.set(width/2, height/2);

        body = world.createBody(bodyDef);

        CircleShape shape = new CircleShape();
        shape.setRadius(1f);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = shape;
        body.createFixture(fixtureDef);

    }

    @Override
    protected void updateGame() {
        world.step(1f / 30f, 6, 2);
        rayHandler.update();
    }

    @Override
    protected void renderGame() {
        box2dDebugRenderer.render(world, camera.combined);
        rayHandler.render();
    }

    @Override
    public void dispose() {
        world.dispose();
    }

    ... // Removed main method, nothing special here.
}

请注意 world.getBodyCount();world.getFixtureCount(); 都是 return 1

问题的可能原因。

  1. 检查您是否在 RayHandler class 或 Box2DDebugRenderer class.[=13= 中调用了 render ]

  2. 您还没有设置圆形的位置。它可能位于边缘并保持在相机范围之外。

  3. 检查你的单位。圆的半径可能小到看不见,也可能大到覆盖整个屏幕。

希望对您有所帮助。

您可以尝试以下方法,其中一个提到 Tanmay Patil,它会调整大小 body:

示例:

变量 Class:

long time = 0;
float testSize = 0;

调用渲染方法:

time += System.nanoTime();
    if (time >= 100000000){
        time = 0;
        testSize += (0.1f); 
        body.getFixtureList().first().getShape().setRadius(testSize);
    }

如果没有发现任何变化,请尝试相反的方法:

time += System.nanoTime();
    if (time >= 100000000){
        time = 0;
        testSize -= (0.1f); 
        body.getFixtureList().first().getShape().setRadius(testSize);
    }

编辑:

另一方面,这不影响问题,但如果需要,可以在此处调用dispose:

    .////////////

    CircleShape shape = new CircleShape();
    shape.setRadius(1f);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape      = shape;
    body.createFixture(fixtureDef);

    shape.dispose();
}

已修复。

问题是我试图在 Box2DDebugRenderer.render(...) 之后调用 RayHandler#render()RayHandler 没有任何 Light 对象(添加 PointLight 允许它呈现),但无论是什么原因,它都很奇怪,但首先调用 RayHandler#render() 允许它工作。这可能是 LibGDX 中的错误,我将报告。