[英]How to pause and resume GameLoop?
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,並且您什么都沒有做就可以了,您仍然可以運行更新,渲染隊列以修改事物,動畫或其他任何東西。
另一個方法是,給每個實體,在您的基本實體中,設置一個暫停的屬性。 然后,您通過我們的實體發送一條消息,比如說pausegame,並將suspended屬性設置為true。 在您的基本實體的虛擬更新中,只需檢查是否已暫停以及是否已設置返回。
第二種是較高級的,與第一種相比具有一些適當的優勢,但是,即使它存在,也至少需要對實體/組件概念進行精心設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.