Я кодирую многопользовательскую игру с помощью 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.
Любая идея, как исправить эту проблему? Заранее спасибо
Несомненно, не создавайте вещи в другом потоке, которые необходимо создать в потоке рендеринга. Возможно, вы захотите прочитать: https://en.wikipedia.org/wiki/Separation_of_concerns. Ваш класс Player (логика игры) не должен заботиться о ShapeRenderer (логика визуализации). В любом случае, прочитайте это: http://stackoverflow.com/help/how-to-ask, потому что ваш вопрос слишком широк (не содержит достаточно деталей), чтобы ответить. – Xoppa
Но если я создаю Игрока за пределами Socket Event, все работает отлично. Какие части информации отсутствуют в моем вопросе? – erik4thewinners
Если вы действительно хотите воспользоваться этим подходом (что не рекомендуется), то это поможет вам включить необходимую информацию: http://stackoverflow.com/help/mcve. В общем, если вы хотите что-то сделать в потоке рендеринга, используйте 'Gdx.app.postRunnable'. – Xoppa