如何暂停和恢复 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?的主要内容,如果未能解决你的问题,请参考以下文章