2011-08-03 4 views
4

나는 게임을 만들고 있는데, 안드로이드를 처음 접했을 때 나는 LunarLander code이라는 예제를 기반으로 디자인을 했어. 설계에서 GameThread.doStart()GameActivity에서 호출되고, (코드의 많은 부분이 명확성을 위해 제거 된) 아래 그림과 같이 스레드는 다음의 GameThread.run() 루프에서 모든 것을 실행 :SurfaceHolder.lockCanvas() null을 반환 함

public class GameActivity extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     gameView = new GameView(this); 
     fl = new FrameLayout(this); 
     fl.addView(gameView); 

     setContentView(fl); 

     gameThread = gameView.getThread(); 
     gameThread.doStart(); 
    } 
} 

합니다.

class GameThread extends Thread 
{ 
    public void doStart() 
    { 
    } 

    public void run() 
    { 
     while (running) 
     { 
      Canvas c = null; 
      try 
      { 
       c = mSurfaceHolder.lockCanvas(); 
       // Use canvas 
      } 
      finally 
      { 
      } 
     } 
    } 
} 

아래 그림과 같이, 내가 GameActivity의 손에 더 많은 제어를 넣어 시도에 내가 실행 봤는데 몇 가지 문제를 해결하려고합니다 :

public class GameActivity extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     gameView = new GameView(this); 
     fl = new FrameLayout(this); 
     fl.addView(gameView); 

     setContentView(fl); 

     gameThread = gameView.getThread(); 

     while (gameThread.isRunning()) 
     { 
      gameThread.run(); 
     } 
    } 
} 

합니다. 나는 lockCanvas()는 항상 null을 반환하고, 따라서 나는 화면에 아무것도 그릴 수 없다고 할 때를 제외하고

class GameThread extends Thread 
{ 
    public void doStart() 
    { 
    } 

    public void run() 
    { 
     Canvas c = null; 
     try 
     { 
      c = mSurfaceHolder.lockCanvas(); 
      // Use canvas 
     } 
     finally 
     { 
     } 
    } 
} 

. 내가 말했듯이 여전히 Android에 익숙하지 않으므로 두 번째 사례가 작동하지 않는 이유를 알 수 없습니다. 누구나 무슨 일이 일어나고 있는지, 왜 작동하지 않는지 알 수 있습니까?

편집 : 내가 테스트 한 것으로부터 표면이 생성되지 않습니다. GameView.onResume() 동안 나는 게임을 계속 진행하기 전에 서페이스가 생성되기를 기다렸지만 영원히 기다렸습니다. 첫 번째 인스턴스가 서페이스가 만들어진 유일한 경우는 어떻게됩니까?

답변

2

작성시 활동에서 thred를 시작하는 반면, SurfaceView가 작성되고 준비된 경우에만 시작되어야합니다. 두 번째 인 SurfaceView 예제를 확인하십시오 : How can I use the animation framework inside the canvas?

+0

은 당신이 제안하는 것은 내가 이미 뭘하는지입니다. 나는 그 코드를 보여주지 않았다. 네가 원한다면 나는 그것을 더할 것이다. –

+0

나는 활동 멈춤에서 쓰레드를 종료하지 않는다. 쓰레드 루프가 어떤 메소드도 호출하지 않도록 부울 플래그를 설정한다. 다시 시작하면이 플래그를 다시 설정하고 애니메이션이 계속됩니다 ... 표면이 파괴되면 surfaceCreated에서 다음에 새 스레드를 만듭니다. – Lumis

+0

표면이 생성되지 않으면이를 감지하고 활동을 다시 시작할 수 있습니다. – Lumis

1

표면이 생성되면 스레드를 실행하십시오. 즉, 콜백 surfaceCreated()가 발생하면 스레드를 시작하십시오.

코드 조각

public void surfaceCreated(SurfaceHolder holder) { 
    thread.setRunning(true); 
    thread.start(); 
} 

Shash

+0

정확히 내가 무엇 인지요. 하기. –