SurfaceHolder.lockCanvas () Возвращает ноль - PullRequest
5 голосов
/ 03 августа 2011

Я создаю игру, и, поскольку я новичок в Android, я основал дизайн на примере Код LunarLander . В своей конструкции 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() всегда возвращает ноль, и поэтому я не могу ничего рисовать на экране. Как я уже сказал, я все еще новичок в Android, поэтому я понятия не имею, почему второй случай не работает. Кто-нибудь знает, что происходит или почему это не работает?

РЕДАКТИРОВАТЬ : Из того, что я тестировал, поверхность никогда не создается. Во время GameView.onResume() я ждал, пока поверхность не будет создана, прежде чем продолжать игру, но она ждала вечно. Почему первый экземпляр - единственный случай, когда поверхность создана?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Вы запускаете thred в действии при создании, но его следует запускать только тогда, когда SurfaceView создан и готов.Проверьте это во втором примере SurfaceView: Как я могу использовать каркас анимации внутри холста?

0 голосов
/ 03 августа 2011

Запустите поток, как только поверхность будет создана. то есть когда вы получаете функцию обратного вызова surfaceCreated (), запускайте поток.

Фрагмент кода

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

Шаша

...