如何暂停和恢复GameLoop?

问题描述:

我在pause后遇到了恢复游戏的问题。我使用SurfaceView,这里是代码的最重要的部分:如何暂停和恢复GameLoop?

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

我想GameLoopThread是一个从线程遗留下来的自定义类。你能告诉我们这个班上用于暂停的代码吗? – Nic007

+0

您是否看过堆栈跟踪以查看线程状态? – fadden

通常你不会暂停整个线程在你的游戏中暂停。当你更新时,渲染通常应该包含任何delta时间对象,你应该为你的delta时间对象实现一个新组件,叫做时间尺度。时间尺度只是自行叠加时间增量以返回修改的增量时间。所以现在如果你想暂停你的游戏,只需将时间刻度设置为0,并且你不再做任何动作,并且你仍然可以运行更新,渲染队列来修改事物,动画或其他任何东西。

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

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