汇集Box2d机构?

时间:2015-11-07 16:54:31

标签: java libgdx box2d pooling

我试图通过联合box2d身体来产生块,我不知道libgdx池是否适用于身体但是如果是,请有人解释我该怎么做以及出了什么问题用我的代码。

首先我在单独的方法上创建了BodyDef和Body:

public BodyDef createDef(){
        BodyDef def = new BodyDef();
        def.type = BodyDef.BodyType.StaticBody;
        def.fixedRotation = true;
        def.position.set(6, 6);

        return(def);
    }

    public Body createBody(){
        Body body = world.createBody(createDef());
        PolygonShape shape = new PolygonShape();
        shape.setAsBox(1, 1);
        body.createFixture(shape, 1.0f);
        shape.dispose();

        return(body);
    }

 public void createPlatform(){
      Body platform = Pools.obtain(Body.class); //then use pooling
        platform = createBody(); //here I set the value equal to the return value of createBody() method 
        bodies.add(platform);//adding platform to the ArrayList
    }

然后生成块我只是调用这个方法:

public void spawnChunk(){
        createPlatform();
    }

我对此很陌生我不知道chunk的含义是什么,但我知道这是用于产生地形的侧滚动游戏,我收到此错误消息

Exception in thread "LWJGL Application" java.lang.RuntimeException: Class cannot be created (missing no-arg constructor): com.badlogic.gdx.physics.box2d.Body
    at com.badlogic.gdx.utils.ReflectionPool.<init>(ReflectionPool.java:41)
    at com.badlogic.gdx.utils.Pools.get(Pools.java:29)
    at com.badlogic.gdx.utils.Pools.get(Pools.java:38)
    at com.badlogic.gdx.utils.Pools.obtain(Pools.java:48)
    at com.nivekbryan.ragingpotato.Physics.createPlatform(Physics.java:53)
    at com.nivekbryan.ragingpotato.Physics.spawnChunk(Physics.java:59)
    at com.nivekbryan.ragingpotato.WorldController.update(WorldController.java:17)
    at com.nivekbryan.ragingpotato.MainClass.render(MainClass.java:27)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)

1 个答案:

答案 0 :(得分:2)

不要在box2d wiki中使用pool2d的身体或关节汇集:

  

因此,当您创建b2Body或b2Joint时,您需要致电工厂   功能在b2World上。你永远不应该尝试分配这些类型   另一种方式。

因此,您只应使用Body body = world.createBody(bodyDef);来创建实体。

接下来,您可以在某种列表中添加这些实体,这是绝对不应该做的!如果你需要访问你世界上的所有身体,那就这样做:

// Global field
Array<Body> bodies = new Array<>();

// When you want to access the bodies.
world.getBodies(bodies);
for(Body body : bodies)
{
    // Do something
}

错误意味着Body类没有看起来像

的构造函数
public Body() {}

因此无法通过通用池类实现创建,因为它试图调用此构造函数。

要解决此问题,您可以自己实施池,但如上所述,您不应该这样做。

您当前代码的另一个错误是您似乎误解了java中的变量赋值。

// gets a body from your pool, arbitrary method
Body pooledBody = getFromPool();

// assigns a new body to pooledBody, so your pooling is "voided".
pooledBody = world.createBody(createDef());

正如您在此示例中所看到的,getFromPool();无效,因为您在下一行中为pooledBody分配了新值。

一个更简单的例子,说明为什么它不能按你的意愿工作:

int a = getFromPool(); // lets says this assigns 4 to a
a = 5;
System.out.println(a);

将始终打印5,永不打印4!

您可以汇集的内容是BodyDefFixutureDefShape类,因为它们没有参数构造函数。