6

我正在制作一款游戏,由于我是 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(),我让活动等待表面被创建,然后再继续游戏,但它一直在等待。为什么第一个实例是创建表面的唯一情况?

4

2 回答 2

3

您在创建时启动了一个活动,而它应该仅在 SurfaceView 已创建并准备好时启动。检查第二个,SurfaceView 示例:如何在画布内使用动画框架?

于 2011-08-03T09:54:55.770 回答
0

创建表面后开始运行线程。即当你得到一个回调surfaceCreated() 时,启动线程。

代码片段

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

沙什

于 2011-08-03T18:07:14.640 回答