2011-08-03 46 views
4

我正在製作遊戲,並且由於我是Android新手,因此我基於示例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(); 
     } 
    } 
} 

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

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

除了當我這樣做lockCanvas()始終返回null,因此我不能畫任何東西到屏幕上。正如我所說我還是新來的Android,所以我不知道爲什麼第二個案件不起作用。任何人都知道發生了什麼或者爲什麼它不起作用?

編輯:從我測試過的東西,表面永遠不會被創建。在GameView.onResume()期間,我在開始遊戲之前已經等待表面創建,但它永遠等待。第一例是表面創建的唯一情況?

回答

2

您正在開始創建活動,只有在創建並準備好SurfaceView時纔會啓動。查看第二個SurfaceView示例:How can I use the animation framework inside the canvas?

+0

什麼你的建議是什麼我已經在做。我只是沒有顯示該代碼。如果你願意,我會添加它。 –

+0

我不關閉活動暫停的線程,只需設置一個布爾標誌,以便線程循環不會調用任何方法。在簡歷上,我重新設置這個標誌,動畫繼續...如果表面被破壞,那麼surfaceCreated將在下一次創建一個新的線程。 – Lumis

+0

如果surface尚未創建,您可以檢測到並重新啓動活動。 – Lumis

1

一旦表面被創建,就開始運行線程。即當你得到一個回調surfaceCreated()時,啓動線程。

代碼段

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

詞shash

+0

這正是我所知道的這樣做。 –