簡體   English   中英

合並Box2d實體?

[英]Pooling Box2d Bodies?

我正在嘗試通過合並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();
    }

我對此很陌生,我不知道塊的含義是什么,但我知道它在側面滾動游戲中用於生成地形, 我得到以下錯誤消息

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)

不要使用box2d Wiki中的box2d實體或關節的緩沖池:

因此,當您創建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!


您可以BodyDefBodyDefFixutureDefShape類,因為它們沒有參數構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM