【问题标题】:Is it ok to create and delete bodies infinitely?可以无限创建和删除body吗?
【发布时间】:2015-11-09 15:45:42
【问题描述】:

我不想使用 libgdx 和 box2d 制作无限横向滚动游戏,为此我必须生成块。与以前我只是处理精灵时不同,我过去常常通过池化并将它们添加到 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
    }

我现在的新想法就是通过调用这个方法来创建一个新的body(body的创建永远不会结束,因为我正在尝试做一个无限的横向滚动游戏)。

 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`

【问题讨论】:

  • 你的问题很清楚。您能否重述您的问题,具体告诉我们您尝试了什么,向我们展示您现在拥有的代码。如果没有适当的说明,我们不能简单地“猜测”你的代码是什么样子或者你到目前为止做了什么。
  • 我们无法判断您所做的某事是否会减慢您的游戏速度。我们没有你的游戏。
  • 请检查我的更新并抱歉。
  • 我不明白为什么尸体不可合并。你为什么要做出这样的假设?
  • 因为我遇到了错误?还有人告诉我,body 应该总是像这样初始化 //Body body = wold,createBody(def);

标签: java libgdx box2d pooling


【解决方案1】:

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

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

如果您的游戏最终出现滞后,您需要改用池化。您可以使用 setTransform 将 box2d 实体从屏幕左侧移动到右侧。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2015-03-16
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多