Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 汇集尸体?_Java_Libgdx_Box2d_Pooling - Fatal编程技术网

Java 汇集尸体?

Java 汇集尸体?,java,libgdx,box2d,pooling,Java,Libgdx,Box2d,Pooling,我正在尝试通过池化box2d body来生成块,我不知道libgdx池化是否适用于body,但如果适用,请有人告诉我怎么做以及我的代码有什么问题 首先,我使用不同的方法创建了BodyDef和Body: public BodyDef createDef(){ BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.fixedRotation = true;

我正在尝试通过池化box2d body来生成块,我不知道libgdx池化是否适用于body,但如果适用,请有人告诉我怎么做以及我的代码有什么问题

首先,我使用不同的方法创建了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)
线程“LWJGL应用程序”java.lang.RuntimeException中的异常:无法创建类(缺少任何参数构造函数):com.badlogic.gdx.physics.box2d.Body
位于com.badlogic.gdx.utils.ReflectionPool.(ReflectionPool.java:41)
位于com.badlogic.gdx.utils.Pools.get(Pools.java:29)
位于com.badlogic.gdx.utils.Pools.get(Pools.java:38)
在com.badlogic.gdx.utils.Pools.get(Pools.java:48)上
位于com.nivekbryan.ragingpato.Physics.createPlatform(Physics.java:53)
请访问com.nivekbryan.ragingpato.Physics.spawnChunk(Physics.java:59)
更新(WorldController.java:17)
位于com.nivekbryan.ragingpoto.MainClass.render(MainClass.java:27)
位于com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
位于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
}
因此,泛型池类实现无法创建,因为它试图调用此构造函数

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


当前代码的另一个错误是,您似乎误解了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



您可以使用的池是
BodyDef
FixutureDef
Shape
类,因为它们没有参数构造函数。

什么是getFromPool()?是否将pooledBody设置为已具有def和fixture的实体?然后创建pooledBody?
getFromPool()
只是一个显示从池中获取主体的任意方法。但正如我所说的,不要这样做,形成box2dwiki:
,因此当您创建b2Body或b2Joint时,您需要调用b2World上的工厂函数。您不应该尝试以其他方式分配这些类型。
我刚刚意识到,由于我无法在实体上使用池,因此使用数组是无用的,因为我的计划是将实体池化,然后将其添加到数组中,并在不需要时将其删除。如果没有共享,我怎么能做到这一点?总是创建一个新的,然后删除它是一个坏主意,因为它消耗更多的内存。
int a = getFromPool(); // lets says this assigns 4 to a
a = 5;
System.out.println(a);