我正在制作游戏,由于我是 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()
期间,我让 Activity 在继续游戏之前等待表面创建,但它一直在等待。为什么第一个实例是创建表面的唯一情况?
最佳答案
您在创建 Activity 时启动了线程,而它应该仅在创建 SurfaceView 并准备就绪时启动。检查第二个,SurfaceView 示例:How can I use the animation framework inside the canvas?
关于android - SurfaceHolder.lockCanvas() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921412/