我正在制作一款游戏,由于我是 Android 新手,我的设计基于LunarLander 示例代码。在其设计中,GameThread.doStart()
调用 from GameActivity
,然后线程从其GameThread.run()
循环中运行所有内容,如下所示(为清楚起见,已删除大部分代码):
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()
,我让活动等待表面被创建,然后再继续游戏,但它一直在等待。为什么第一个实例是创建表面的唯一情况?