如何暂停和恢复 GameLoop?

Posted

技术标签:

【中文标题】如何暂停和恢复 GameLoop?【英文标题】:How to pause and resume 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 的自定义类。你能告诉我们这个类中用于暂停的代码吗? 您是否查看了堆栈跟踪以查看线程状态? 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何暂停和恢复 GameLoop?的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停和恢复 UIView 动画(没有块动画)?

如何在 C# 中暂停和恢复音频

如何使用暂停和恢复创建 ProgressDialog

如何使用 threading 模块暂停和恢复线程?

如何在 iphone 中暂停和恢复 NSTimer

Spotify - 如何暂停曲目和恢复曲目