2017-02-17 80 views
0

我使用Node.js和特定的Socket.io編寫了一個使用LibGDX的多人遊戲。 當一個新的玩家連接,客戶端得到一個事件稱爲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(); 
        //... 

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

但是,如果我在套接字事件之外創建一個播放器,一切工作正常。我的問題中缺少哪些信息? – erik4thewinners

+1

如果你真的想採取這種方式(這是不推薦的),那麼這將幫助你包含所需的信息:http://stackoverflow.com/help/mcve。一般來說,如果你想在渲染線程上做一些事情,那麼使用'Gdx.app.postRunnable'。 – Xoppa

回答

0

好的,我解決了這個問題。

由於Xoppa在問題的評論部分中建議,在播放器類中創建ShapeRenderer是一個壞主意,所以我在我的WorldRenderer類中創建了一個並使用此類。

相關問題