LibGDX Box2D:无法获取Fixture来渲染

时间:2015-04-23 01:47:35

标签: java libgdx jbox2d

我最近一直试图回到LibGDX的Box2D版本,我回顾了几个月前创建的一个演示,我的代码看起来很好,从我的Google搜索结果中,我的代码很好,但对于我的生活,我无法让Fixture渲染。

这是我的(极简主义示例)代码,对于我的生活,我无法让它工作注意:我在LibGDX Game类周围构建了一个包装器,应该是不言自明的< / EM>:

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

3 个答案:

答案 0 :(得分:0)

问题的可能原因。

  1. 检查您是否在render班级或RayHandler班级中对灯具发出了Box2DDebugRenderer

  2. 您尚未设置圆形的位置。它可能位于边缘,并且不在镜头范围内。

  3. 检查您的单位。圆的半径可能相对较小,以至于它不可见,或者可能很大,以至于它可能覆盖整个屏幕。

  4. 希望这有帮助。

答案 1 :(得分:0)

您可以尝试以下方法,其中一项提到Tanmay Patil,它调整了身体的大小:

示例:

可变类:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>svg preloader</title>
  <script src="http://okwutelabs.com/js/jquery-1.11.1.min.js"></script>
  <script src="http://okwutelabs.com/js/jquery.lazylinepainter-1.1.min.js"></script>
  <script src="http://okwutelabs.com/js/raphael-min.js"></script>
</head>

<body>
  <!-- Preloader -->
  <div id="preloader">
    <div id="status">
      <div id="icons"></div>
    </div>
  </div>
  <!-- #Preloader -->
  <img src="http://www.jesuspaintings.com/pictures/field_of_dreams_big.jpg" alt="">
  <img src="http://www.sinoorigin.com/images/modern-landscape/large/modern-landscape-painting-012.jpg" alt="">
  <img src="http://s3.amazonaws.com/artspan-fs/member_files/nmistry/Adirondack_Fall.JPG" alt="">
</body>

</html>

调用渲染方法:

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

答案 2 :(得分:0)

固定。

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