如何暂停和恢复GameLoop?

时间:2015-05-14 10:24:17

标签: java android surfaceview resume game-loop

我在pause之后恢复游戏时遇到问题。我正在使用SurfaceView,这是代码中最重要的部分:

void pause() {
    if (!pause) {
        gameLoopThread.setRunning(false);
        pause = !pause;
        System.out.println("pause");
    }
    else {
        gameLoopThread.setRunning(true);
        System.out.println("end pause");
        pause = !pause;
    }
}

public GameView(Context context) {
    super(context);
    gameLoopThread = new GameLoopThread(this);

    getHolder().addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            gameLoopThread.setRunning(false);

            while (retry) {
                try {
                    gameLoopThread.join();
                    retry = false;
                } catch (InterruptedException e) {}
            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            //createSprites();

            gameLoopThread.setRunning(true);
            gameLoopThread.start();
            thread1.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format,
                                    int width, int height)
        {
        }

当我第一次使用pause时,游戏正在停止,但是当我第二次使用pause尝试恢复游戏时它不起作用,但是我已经打印了“结束暂停”在日志中。

1 个答案:

答案 0 :(得分:0)

通常你不会暂停整个帖子以暂停你的游戏。作为你的更新,渲染通常应该有任何delta时间对象,你应该为你的delta时间对象实现一个新组件,称为时间尺度。时间尺度只是将时间增量单独拖曳以返回修改的增量时间。所以现在如果你想暂停你的游戏,只需将时间刻度设置为0,你就不再做任何动作了,你仍然可以有一个正在运行的更新,渲染队列来修改内容,动画或任何其他内容。

另一种方法可能是,给每个实体,假设在你的基础实体中,一个暂停的属性。然后你通过你的实体发送一条消息,让我们说暂停游戏和暂停的属性get设置为true。在ur base entity的虚拟更新中,只检查是否暂停,如果设置为return。

第一个是比较先进的一个,与第一个相比有一些优势,但如果它存在,至少需要一个好的实体/组件概念设计。