#java #android #android-activity
#java #Android #android-активность
Вопрос:
В настоящее время я работаю над игрой в 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: перезапущен
Почему на самом деле это не приостанавливает игру, а вместо этого продолжает перемещать объекты?
Редактировать:
Моя кнопка — это просто прямоугольник размером 100×100 пикселей, который плавает в правом верхнем углу. Кнопка отображается в виде растрового изображения 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);
}
}
Это метод приостановки для кнопки.
Этот метод вызывается пользователем с помощью физической кнопки — другой метод pause, который вы видите выше, должен вызываться при закрытии приложения (которое работает отлично, но на данный момент оно закрывается, оно не выполняет другие действия внутри метода)
Что подробно делает метод: устанавливает логическое значение paused = true; устанавливает временную шкалу int = 0
Gameloop всегда вызывает update() для каждого кадра для моего класса player, где в этом методе update () он устанавливает скорость * временную шкалу, приводящую к остановке движения, когда временная шкала = 0.
Все это отлично работает с моей кнопкой паузы, но не с onRestart ()
Комментарии:
1. Покажите код для вашей кнопки «пауза». Отредактируйте свой вопрос и добавьте туда код, пожалуйста.
2. вызывается ли ваш
pause()
метод? Добавьте ведение журнала отладки и проверьте3. Как я уже говорил в моем вопросе я проверил, если метод
pause()
вызывается с помощью простой метод println() в консоли, и это делает вам позвонил. Он не выполняет функции метода. Я предполагаю, что он не вызывает методы update () через мой поток после того, как он вызвал onStop (), поэтому он не обновит мои игровые объекты, но это очень маловероятно, потому что они продолжают перемещаться после закрытия приложения, что происходит только с помощью методов update ()…