Game Loop anhalten

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 3

28.11.2016 19:39:50 via Website

Bin gerade bei meiner ersten App und hab da ein Problem hoffe ihr könnt mir helfen.

Wenn ich meine App starte läuft die GameLoop so wie sie laufen soll, jedoch wenn ich meine GameLoopThread pausieren will läuft diese einfach weiter. Dabei wird bei public void setRunning die Variable isRunning auf false gesetzt, welches ich mit Log.d überprüft habe. Jedoch wird die while Schleife nicht angehalten und bei Log.d(isRunning) ist die Variable isRunning immer noch true.
Hoffe mir kann jemand helfen, danke im vorhinein.

import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.util.Log;

public class GameLoopThread extends Thread {
    static final long FPS = 30;
    private GameView theView;
    public boolean isRunning = false;

    public GameLoopThread(GameView theView) {
        this.theView = theView;
    }

    public void setRunning(boolean run) {
        isRunning = run;
        Log.d("setRunning", String.valueOf(isRunning));
    }

    @SuppressLint("WrongCall") @Override
    public void run() {
        long TPS = 1000 / FPS;
        long startTime, sleepTime;
        while (isRunning) {
            Log.d("isRunning ", String.valueOf(isRunning));
            Canvas theCanvas = null;
            startTime = System.currentTimeMillis();
            try {
                theCanvas = theView.getHolder().lockCanvas();
                synchronized (theView.getHolder()) {
                    theView.onDraw(theCanvas);
                }
            } finally {
                if (theCanvas != null) {
                    theView.getHolder().unlockCanvasAndPost(theCanvas);
                }
            }
            sleepTime = TPS - (System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    sleep(sleepTime);
                else
                    sleep(10);
            } catch (Exception e) {

            }
        }
    }
}
  • Forum-Beiträge: 2.214

28.11.2016 20:37:32 via Website

Hallo Bernhard,

möchtest du den Thread komplett verlassen , oder nur pausieren ?

im Pausieren Fall müsstest du ein Flag setzen , im Verlassen-fall schlichtweg ein return.

Siehe auch hier
http://stackoverflow.com/a/23757841/6337627

— geändert am 28.11.2016 21:00:19

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 3

29.11.2016 19:01:22 via Website

Danke swa00 für die schnelle Antwort.

Ich möchte den Thread nur pausieren.
Hab mir den Link angesehen und ein paar Sachen ausprobiert, habs aber nicht geschaft.
Könntest du mir noch einmal genauer erklären welches Flag ich setzen muss bzw. wie ich dieses setzen kann.

  • Forum-Beiträge: 2.214

29.11.2016 20:33:20 via Website

Hallo Bernhard,

Global deklarierst du eine Variable

private Boolean isPaused = false;

Mit einem Button "Pause" setzt die diese auf true;
Mit Resume auf false

und innerhalb deiner while schleife z.b

if (isPaused == true)
{
SytemTime.sleep (1000);
}
else
{
do my thing
}

— geändert am 29.11.2016 20:33:56

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 3

05.12.2016 19:12:32 via Website

Danke für deine Hilfe.

Hab jetzt aber herausgefunden, dass es nicht an der while Schleife liegt, sondern von wo setrunning aufgerufen wird. Wird diese zum Beispiel von onTouchEvent aufgerufen kann ich die while Schleife anhalten. Wird setrunning jedoch von meiner pause Methode aufgerufen stoppt die while Schleife nicht, obwohl in der setrunning Methode die Variable isrunning auf false setzt.

Hast du dazu eine Idee woran dies liegen kann?