我在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
尝试恢复游戏时它不起作用,但是我已经打印了“结束暂停”在日志中。
答案 0 :(得分:0)
通常你不会暂停整个帖子以暂停你的游戏。作为你的更新,渲染通常应该有任何delta时间对象,你应该为你的delta时间对象实现一个新组件,称为时间尺度。时间尺度只是将时间增量单独拖曳以返回修改的增量时间。所以现在如果你想暂停你的游戏,只需将时间刻度设置为0,你就不再做任何动作了,你仍然可以有一个正在运行的更新,渲染队列来修改内容,动画或任何其他内容。
另一种方法可能是,给每个实体,假设在你的基础实体中,一个暂停的属性。然后你通过你的实体发送一条消息,让我们说暂停游戏和暂停的属性get设置为true。在ur base entity的虚拟更新中,只检查是否暂停,如果设置为return。
第一个是比较先进的一个,与第一个相比有一些优势,但如果它存在,至少需要一个好的实体/组件概念设计。