[英]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!
您可以BodyDef
是BodyDef
, FixutureDef
和Shape
类,因为它们没有参数构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.