我正在製作遊戲,並且由於我是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()
期間,我在開始遊戲之前已經等待表面創建,但它永遠等待。第一例是表面創建的唯一情況?
什麼你的建議是什麼我已經在做。我只是沒有顯示該代碼。如果你願意,我會添加它。 –
我不關閉活動暫停的線程,只需設置一個布爾標誌,以便線程循環不會調用任何方法。在簡歷上,我重新設置這個標誌,動畫繼續...如果表面被破壞,那麼surfaceCreated將在下一次創建一個新的線程。 – Lumis
如果surface尚未創建,您可以檢測到並重新啓動活動。 – Lumis