2013-05-09 1 views
2

나는 Libgdx 라이브러리를 사용하여 Android 플랫폼 용 게임을 개발하려고합니다. 네트워크의 경우 Kryonet 라이브러리를 사용합니다.libgdx & kryonet : threads

내 응용 프로그램이 내 서버에 연결되어있을 때 화면을 변경하고 싶습니다.
네트워크 부분 일 것 같다하지만 난 스레드에 문제가 : 그것은 아닌 Libgdx 스레드는 OpenGL을 실행되는 Kryonet의 스레드의 :

public class MyGdxGame extends Game { 
    public static int UDP_PORT = 55555, TCP_PORT = 55556; 
    private Client client; 

    @Override 
    public void create() { 
     /* 
     * client connection 
     * etc ... 
     */ 
     client.addListener(new Listener() { 
      private int nb = 0; 

      @Override 
      public void received(Connection connection, Object data) { 
       super.received(connection, data); 
       nb++; 
       if (nb == 5) { 
        MyGdxGame.this.setSecondScreen(); 
       } 
      } 
     }); 
     setScreen(new First(this, client)); 
    } 

    protected void setSecondScreen() { 
     setScreen(new Second(this, client)); //This part should be executed by Libgdx thread ?!  
    } 

참고 먼저와 두 번째이 화면 클래스 모두있는 단지 이미지를 그려라. "클라이언트"java.lang.RuntimeException가 스레드에 예외 : 현재 스레드에서 찾을 수 없습니다 OpenGL을 컨텍스트 나는 둘째 화면을 실행하려고 할 때

나는이 예외가있다.

LibGDX 스레드가 강제로 명령을 실행할 수 있습니까? 다른 접근 방법이 있습니까?

Libgdx에 감사의 조나단

답변

6

하나 개의 스레드 (응용 프로그램 수명주기 콜백을 실행하는 스레드가) 유효한 OpenGL을 컨텍스트를 가지고와 OpenGL 호출을 호출 할 수 있습니다. 다른 스레드 대신 GDX 스레드에 Runnable을 게시하여 다른 스레드를 대신하여 작업을 수행하도록 할 수 있습니다. 게시 된 실행 파일은 다음 렌더링 콜백이 실행되기 전에 실행됩니다. 당신이 이런 식으로 뭔가를 할 수 귀하의 경우에는 Gdx.app.postRunnable()

를 참조하십시오 : 당신이 당신의 MyGdxGameRunnable을 할 경우

@Override 
public void received(Connection connection, Object data) { 
    super.received(connection, data); 
    nb++; 
    if (nb == 5) { 
     final MyGdxGame g = MyGdxGame.this; 
     Gdx.app.postRunnable(new Runnable() { 
     public void run() { 
      g.setSecondScreen(); 
     }); 
    } 
} 

을 이런 일이 발생하는 빈도에 따라, 각 콜백에 대한 새로운 Runnable을 할당하고 싶은, 그래서 수 있습니다 Runnable을 구현하는 맞춤 Listener을 만들면 할당을 피할 수 있습니다.

+0

멋지다. 나는 몰랐다. 나는 가능한 한 빨리 노력한다. 버그 정확히 내가 원하는거야. Runnable은 게임이 시작될 때 한 번만 실행해야합니다. 따라서 할당 코드를 사용할 수 있다고 가정합니다. 감사! – Jonathan