2015-11-07 4 views
0

Я пытаюсь создать куски, объединив box2d Bodies, я не знаю, применим ли объединение libgdx к телам, но если это, пожалуйста, кто-нибудь объяснит мне, как это сделать и что не так с моим кодом.Объединение корпусов Box2d?

Сначала я создал BodyDef и тело на отдельно методы:

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) 

ответ

2

Не используйте Объединив для Box2D органов или суставов, из 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, FixutureDef и Shape классов, так как они не имеют никаких аргументов конструктора.

+0

Что такое getFromPool()?вы установили pooledBody равным телу, у которого уже есть def и fixture? а затем создать pooledBody? –

+0

'getFromPool();' это просто произвольный метод, показывающий, что вы получили тело из пула. но, как я уже сказал, не делайте этого, создайте box2d wiki: «Итак, когда вы создаете b2Body или b2Joint, вам нужно вызвать заводские функции на b2World. Вы никогда не должны пытаться выделять эти типы другим способом. « –

+0

Я просто понял, что, поскольку я не смогу использовать объединение на телах, использование массива бесполезно, потому что мой план состоял в том, чтобы объединить тело, а затем добавить его в массив и удалите его, когда это не нужно. Как я могу это сделать без объединения? всегда создавая новый, а затем удаляя его, это плохая идея, потому что он потребляет больше памяти. –

Смежные вопросы