2017-02-17 30 views
0

Я кодирую многопользовательскую игру с помощью LibGDX с помощью Node.js и, в частности, Socket.io. Когда новый игрок соединяется, клиент получает мероприятие под названием getPlayers: классLibGDX/Socket.io: Нет контекста OpenGL в текущем потоке

public void configSocketEvents(){ 
socket.on("getPlayers", new Emitter.Listener() { 
     @Override 
     public void call(Object... args) { 
      JSONArray objects = (JSONArray) args[0]; 
      try { 
       for(int i = 0; i < objects.length(); i++){ 

        Player enemy = new Player(); 
        //... 

игрока:

public Player() { 
    renderer = new ShapeRenderer(); 
    init(); 
} 

Теперь, когда второй клиент подключается, следующее сообщение об ошибке выводится как для клиентов:

Exception in thread "EventThread" java.lang.RuntimeException: No OpenGL context found in the current thread. 
... 
at de.ej.facharbeitsspiel.Game.Player.<init>(Player.java:26) 
at de.ej.facharbeitsspiel.Screens.GameScreenMP$1.call(GameScreenMP.java:149) 

Строка 149 - это линия Player enemy = new Player();, поэтому проблема заключается в том, что новый ShapeRenderer() не может быть загружен, а не поток рендеринга OpenGL.

Любая идея, как исправить эту проблему? Заранее спасибо

+1

Несомненно, не создавайте вещи в другом потоке, которые необходимо создать в потоке рендеринга. Возможно, вы захотите прочитать: https://en.wikipedia.org/wiki/Separation_of_concerns. Ваш класс Player (логика игры) не должен заботиться о ShapeRenderer (логика визуализации). В любом случае, прочитайте это: http://stackoverflow.com/help/how-to-ask, потому что ваш вопрос слишком широк (не содержит достаточно деталей), чтобы ответить. – Xoppa

+0

Но если я создаю Игрока за пределами Socket Event, все работает отлично. Какие части информации отсутствуют в моем вопросе? – erik4thewinners

+1

Если вы действительно хотите воспользоваться этим подходом (что не рекомендуется), то это поможет вам включить необходимую информацию: http://stackoverflow.com/help/mcve. В общем, если вы хотите что-то сделать в потоке рендеринга, используйте 'Gdx.app.postRunnable'. – Xoppa

ответ

0

Хорошо, я решил проблему.

Как Xoppa рекомендуется в разделе комментариев в вопросе, это плохая идея создать ShapeRenderer в классе игрока, поэтому я создал его в своем классе WorldRenderer и использовал его.