可以无限制地创建和删除主体吗?

时间:2015-11-09 15:45:43

标签: java libgdx box2d pooling

我不想使用libgdx和box2d制作一个无限的侧滚动游戏,为此我必须生成块。与之前我刚刚处理sprite时不同,我曾经无限次地生成sprite,没有问题,可以通过池化并将它们添加到ArrayList并使用迭代器控制它们。但是现在我使用静态物体作为我的地形并且不能用物体进行合并,所以可以一直创建一个新体并在不需要时删除它们。这会减慢我的比赛速度吗?如果有的话,更好的方法是什么?谢谢。

更新

这是我当前的代码,它无法正常工作,因为池不适用于box2d实体。 首先,我在单独的方法上创建了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 createBody(){
            BodyDef def = new BodyDef();
            def.type = BodyDef.BodyType.StaticBody;
            def.postion.set(position.x, position.y);

            PolygonShape shape = new PolygonShape();
            shape.setAsBox(size.x, size.y);
            myBody = world.createBody(def, 1.0f);
            shape.dispose();
        } `//I'm still working on how to remove bodies`

2 个答案:

答案 0 :(得分:2)

是。可以无限期地创建和删除主体。

根据您一次创建的身体数量,所涉及的分配和垃圾收集可能会最终落后于您的游戏。

如果您的游戏最终落后于您,则需要切换到使用池。您可以使用setTransform将box2d实体从屏幕左侧移动到右侧。

答案 1 :(得分:0)

DylanVann已经回答了这个问题,但我只想指出,该函数不是创建BodyDef和Shape的新对象,而是可以重用它。

如果您过于频繁地创建和销毁形状(例如每秒3-4次),请保持BodyDef的引用,甚至是Shape。

 public void createBody(){
        def.type = BodyDef.BodyType.StaticBody;
        def.postion.set(position.x, position.y);

        shape.setAsBox(size.x, size.y);
        myBody = world.createBody(def, 1.0f);
 }