【问题标题】:How to pause and resume GameLoop?如何暂停和恢复 GameLoop?
【发布时间】:2015-05-14 10:24:16
【问题描述】:

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 恢复游戏时它不起作用,但我在日志中打印了“结束暂停”。

【问题讨论】:

  • 我想 GameLoopThread 是继承自 Thread 的自定义类。你能告诉我们这个类中用于暂停的代码吗?
  • 您是否查看了堆栈跟踪以查看线程状态?

标签: java android surfaceview resume game-loop


【解决方案1】:

通常你不会暂停整个线程来暂停你的游戏。随着您的更新,渲染通常应该具有任何类型的增量时间对象,您应该为您的增量时间对象实现一个新组件,称为时间刻度。时间尺度本身只是乘以时间增量以返回修改后的增量时间。所以现在如果你想暂停你的游戏,只需将时间刻度设置为 0,你什么都没做,你仍然可以有一个正在运行的更新,渲染队列来修改东西,动画或其他任何东西。

另一种方法是,给每个实体,比方说在你的基础实体中,一个暂停的属性。然后你通过你的实体发送一条消息,让我们说 pausegame 并且 paused 属性设置为 true。在您的基础实体的虚拟更新中,只需检查是否已暂停,如果设置则返回。

第二个比第一个更先进,比第一个有一些适当的优势,但如果它存在的话,至少需要对你的实体/组件概念进行良好的设计。

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2013-07-19
    • 2015-07-28
    相关资源
    最近更新 更多