如何暂停和恢复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
秒时间恢复游戏不起作用,但我在日志中打印了“结束暂停”。
答
通常你不会暂停整个线程在你的游戏中暂停。当你更新时,渲染通常应该包含任何delta时间对象,你应该为你的delta时间对象实现一个新组件,叫做时间尺度。时间尺度只是自行叠加时间增量以返回修改的增量时间。所以现在如果你想暂停你的游戏,只需将时间刻度设置为0,并且你不再做任何动作,并且你仍然可以运行更新,渲染队列来修改事物,动画或其他任何东西。
另一种方法可以是给每个实体,让我们说在你的基本实体中,一个暂停的属性。然后你通过你的实体发送一条消息,让我们说暂停游戏,暂停的属性get设置为true。在你的基本实体的虚拟更新只是检查暂停,如果设置返回。
secound是一个更先进的,比第一个有一些优势的优势,但是如果它存在的话,至少需要一个很好的ur实体/组件概念设计。
我想GameLoopThread是一个从线程遗留下来的自定义类。你能告诉我们这个班上用于暂停的代码吗? – Nic007
您是否看过堆栈跟踪以查看线程状态? – fadden