2015-11-13 3 views
1

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

//this is my first try, the idea was to call this method when contact is detected. 
public static void movePlatform(){ 
     platform.setTransform(position.x += 21f, position.y, 0f); 
    } 

//on my contact listener class 

public void beginContact(Contact contact) { 
     Fixture fa = contact.getFixtureA(); 
     Fixture fb = contact.getFixtureB(); 

     Platform.movePlatform(); 
    } 

Я также попытался это, но я не знаю, если это возможно, чтобы сделать это:

public void beginContact(Contact contact) { 
     Fixture fa = contact.getFixtureA(); 
     Fixture fb = contact.getFixtureB(); 

     fb.getBody().setTransform(10f, 0f, 0f); 
    } 

, когда тело сталкивается с другим телом, настольное приложение перестает отвечать на запросы, и я получаю это сообщение :

Это приложение попросило Runtime завершить его в необычным способом. Обратитесь в службу поддержки приложения за дополнительной информацией . AL lib: (EE) alc_cleanup: 1 устройство не закрыто Утверждение не удалось!

Программа: C: \ Program Files \ Java \ jdk1.8.0_51 \ Bin \ java.exe Файл: /вар/Библиотека/Jenkins/рабочее пространство/libgdx/расширения/GDX-box2d/GDX-box2d/JNI/Box2D/Динамика/b2Body.cpp, линия 419

Expression: m_world-> IsLocked() == ложный

+0

Также можно рассмотреть [этот ответ] (http://stackoverflow.com/a/28380723/1841194). –

ответ

3

Я думаю, ваша проблема заключается в том, что код в контактном слушателя вызывается во время шага моделирования так что вы не можете изменить мир там. Другими словами, мир заперт. Одним из способов решения проблемы является наличие Gdx.app.postRunnable. Так что в вашем примере попробуйте:

public void beginContact(Contact contact) { 
     Fixture fa = contact.getFixtureA(); 
     Fixture fb = contact.getFixtureB(); 

     Gdx.app.postRunnable(new Runnable() { 

       @Override 
       public void run() { 
        fb.getBody().setTransform(10f, 0f, 0f); 
       } 
     }); 
} 

Это будет работать код в Runnable в визуализации нити в следующем кадре.

Edit:

В beginContact рендер поток блокируется, что означает, что вы не можете перемещать или управлять любым Box2D связанные тела). Это необходимо для правильной работы box2d. Runnable - это специальный интерфейс в Java, который реализуется классом Thread. Это откроет новый поток и передаст данные в поток рендеринга в следующем кадре. Я бы посоветовал вам читать больше о libgdx threading

+0

спасибо, что это сработало, но не могли бы вы объяснить, что делает метод beginContact()? –

+0

Я новичок в программировании в целом, это первый раз, когда я столкнулся с таким кодом. Метод, в котором есть метод внутри. –

+0

см. Раздел редактирования для получения дополнительной информации – george

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