Переопределить onStop () и onRestart () вызов правильно, но не будет делать следующий код - PullRequest
1 голос
/ 05 апреля 2019

В настоящее время я работаю над игрой в Android Studio, которая сочетает в себе Java и Android.

Моя проблема: Когда я закрываю приложение, подожду несколько секунд и вернусь в приложение, оно все еще работает в фоновом режиме. Это заставляет игровые объекты продолжать двигаться, что всегда приводит к окончанию игры.

Я реализовал функцию / метод «Пауза» в моей игре, к которой можно получить доступ с помощью кнопки «Пауза», но она также должна вызываться при закрытии приложения. Это должно приостановить игру, когда я закрою приложение, и приостановиться, когда я вернусь к своему приложению.

Я также реализовал функцию / метод «Возобновить», чтобы выйти из экрана паузы, которая также должна вызываться при повторном входе в приложение.

Оба метода "public void pause ()" и "public void resume ()" вызываются правильно, когда моя деятельность вызывает методы onStop () и onRestart (), но они не делают то, что обычно делают при вызове через паузу кнопка.

Я проверил это с помощью простого System.out.println (""); Это показало мне, что мои методы pause () и resume () вызываются при закрытии или повторном входе в мое приложение. Но они фактически не выполняют логику, стоящую за ними (пауза в игре)

Мой класс MainActivity

public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

scene = new GameplayScene();

@Override
    protected void onStop() {
        super.onStop();
        scene.pause(); //
        System.out.println("stopped"); //testing purposes
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        scene.resume();
        System.out.println("restarted"); //testing purposes
    }
}

И мой класс GamePlayScene

public void pause() {
        System.out.println("Pause Method Called");//works
        paused = true;
        timeScale = 0; //this freeze all movement (game pause)

        pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
    }

    public void resume() {
        System.out.println("Resume Method Called");
        paused = false;
        timeScale = 1; //this unlocks every movement again (game resume)
        touchable = true;

        pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.pausesymbol);
    }

Как я уже сказал: каждый необходимый метод вызывается правильно.

I / System.out: вызван метод паузы I / System.out: остановлен

I / System.out: метод возобновления вызова I / System.out: перезагрузка

Почему он на самом деле не останавливает игру, а вместо этого продолжает перемещать объекты?

EDIT:

Моя кнопка - это просто прямоугольник размером 100x100 пикселей, который плавает в верхнем правом углу. Кнопка отображается через растровое изображение файла pausebutton.png, и я проверяю, была ли кнопка нажата следующим образом:

public void pause(float touchX, float touchY) {
        if (pauseRect.contains((int)touchX,(int) touchY)) {
            paused = true;
            timeScale = 0;

            pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
        }
    }

Это метод паузы для кнопки. Этот метод вызывается пользователем на физической кнопке - другой метод паузы, который вы видите выше, должен вызываться при закрытии приложения (которое прекрасно работает, но в момент закрытия оно не выполняет другие действия внутри метода)

Что метод делает в деталях: устанавливает логическое значение paused = true; устанавливает int timeScale = 0

gameloop всегда вызывает update () для каждого кадра моего класса игрока, где в этом методе update () он устанавливает скорость * timeScale, приводящую к остановке движения, когда timeScale = 0.

Все это прекрасно работает с моей кнопкой паузы, но не с onRestart ()

...