簡體   English   中英

如何暫停和恢復GameLoop?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM