我正在制作游戏,因为我是Android的新手,所以我根据示例LunarLander code设计了该设计。在其设计中,GameThread.doStart()
从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()
期间,我让活动等待表面创建,然后继续游戏,但它等待了永远。为什么第一个实例是创建曲面的唯一情况呢?
答案 0 :(得分:2)
您正在开始创建活动,而它应该仅在创建并准备好SurfaceView时启动。检查第二个,SurfaceView示例:How can I use the animation framework inside the canvas?
答案 1 :(得分:0)
创建曲面后开始运行线程。即当你得到一个回调surfaceCreated()时,启动线程。
代码段
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
词shash