2012-05-31 4 views
2

Когда я уничтожаю объект, состоящий из нескольких тел, соединенных суставами, мое приложение падает без ошибок. Конечно, я сделал некоторые исследования и обнаружил, что это происходит, когда один разрушает тела, в то время как физический движок вычисляет шаг. Поэтому я просто добавляю тела в список и уничтожаю их в onUpdate(), но это не помогло. Самое забавное, что разрушение простых тел работает как шарм даже вне onUpdate() и никогда не приводило к крушению.Сбой при разрушении тел

Там не было никакого вывода ошибок, только один раз мне удалось поймать один говорил, что проблема является NullPointerException в World.java на линии 507. Удивительно, но там я нашел следующее:

public boolean isLocked() 
    { 
     return jniIsLocked(addr); 
    } 

Может кто-то сказать мне, что может быть? Я даже зашел так далеко, чтобы уничтожить тела по одному:

if (!destroyList.isEmpty()){ 
    Body b = destroyList.get(0); 
    destroyList.remove(0); 
    mPhysicsWorld.destroyBody(b); 
} 

Проблема сохраняется.

Примечания: Объект, который я уничтожаю, состоит из нескольких тел, соединенных WeldJoints с одним центральным телом. Тела перекрываются, поэтому я использую отрицательный groupIndex, чтобы они не сталкивались друг с другом. Удаление всех суставов, связанных с определенным телом, перед удалением не помогает. Выхода ошибки:

05-31 15:32:02.486: W/dalvikvm(927): JNI WARNING: JNI method called with exception raised 
05-31 15:32:02.497: W/dalvikvm(927):    in Lcom/badlogic/gdx/physics/box2d/World;.jniStep (JFII)V (CallBooleanMethodV) 
05-31 15:32:02.497: W/dalvikvm(927): Pending exception is: 
05-31 15:32:02.506: I/dalvikvm(927): Ljava/lang/NullPointerException;: 
05-31 15:32:02.526: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.contactFilter(World.java:507) 
05-31 15:32:02.526: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method) 
05-31 15:32:02.536: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.step(World.java:298) 
... 
+0

У вас по-прежнему возникает проблема, если вы уничтожаете только суставы? Вы также можете проверить World.java:507 тоже :) – iforce2d

+0

В третий раз, да, я пробовал уничтожать суставы. Я также посмотрел World.java:507. Оба написаны в вопросе :-) – JohnEye

+0

Вопрос гласит: «Удаление всех суставов, связанных с определенным телом перед удалением, не помогает». Я спрашивал, пытались ли вы уничтожить ТОЛЬКО суставы (и покинули тела). – iforce2d

ответ

3

Я думаю, что вы должны сначала удалить физический соединитель, и вы должны сделать все это в методе обновления. Итак, последовательность удаления - 1. Удалите соединения с корпуса 2. Снимите разъем физики 3. Уничтожьте корпус из мира и другую необходимую вещь, с которой вам нужно управлять вручную, чтобы я не упоминался.

EDIT: Я нашел для вас другую вещь. Для уничтожения тела и суставов вам необходимо внедрить обработчик runnable. Следующий код работает для меня, где я видел, как удалить тело.

dRunnableHandler.postRunnable(new Runnable() { 
     @Override 
     public void run() { 

      // destroy the bullet body 
      PhysicsConnector physicsConnector = gameObject 
        .getPhysicsWorld().getPhysicsConnectorManager() 
        .findPhysicsConnectorByShape(Bullet.this); 
      gameObject.getPhysicsWorld().unregisterPhysicsConnector(
        physicsConnector); 

      gameObject.getPhysicsWorld().destroyBody(bulletBody); 
      particleSystem.setParticlesSpawnEnabled(false); 

      gameObject.getEngine().getScene().detachChild(Bullet.this); 

      gameObject.removeBulletCounter++; 
     } 
    }); 
+0

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

+0

Ну, разрушая разъем, не разбивает игру. – JohnEye

+1

Пожалуйста, см. Я отредактировал свой ответ. – Siddharth

1

подмигнул только идея, но, возможно, года должны уничтожить суставы перед разрушением тела.

+0

Пробовал, что не помогает. См. Последний абзац. – JohnEye

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