libGDX. Урок 19. Кнопка «Назад»

Итак, у нас теперь имеется возможность из экрана меню попасть на экран игры, но не наоборот. Добавим этот функционал в нашу игру с помощью кнопки «Назад» («Back»). Сперва нужно сохранить ссылку на объект класса MainGame в классе BasketBall, чтобы у нас появилась возможность переключения экранов:

public static MainGame game; // экземпляр класса MainGame нужен для доступа к вызову метода setScreen

public BasketBall (MainGame game) {

    BasketBall.game = game;

    // получаем размеры экрана устройства пользователя и записываем их в переменнные высоты и ширины

Будем передавать эту ссылку в классе MenuScreen в качестве параметра:

if((touchX>=startButtonSprite.getX()) && touchX<= (startButtonSprite.getX()+startButtonSprite.getWidth()) && (touchY>=startButtonSprite.getY()) && touchY<=(startButtonSprite.getY()+startButtonSprite.getHeight()) ){
        game.setScreen(new BasketBall(game)); // Переход к экрану игры
        }
// обработка касания по кнопке Exit

Теперь объявим переменные текстуры и спрайта для кнопки «Назад» («Back») в классе GameManager:

static Preferences prefs; // объект класса Preferences
public static Sprite backButtonSprite; // спрайт кнопки "Назад"
public static Texture backButtonTexture; // текстура кнопки "Назад"

public static void initialize(float width,float height){

Далее инициализируем эти переменные в методе initialize():

ballTexture = new Texture(Gdx.files.internal("ball.png"));

//загружаем текстуру кнопки "Назад"
backButtonTexture = new Texture(Gdx.files.internal("backbutton.png"));
//устанавливаем текстуру кнопки "Назад в спрайт"
backButtonSprite= new Sprite(backButtonTexture);

SpawnManager.initialize(width, height, ballTexture);

Отрисовываем её в методе renderGame():

basket.render(batch);
//отрисовка кнопки "Назад"
backButtonSprite.draw(batch);
TextManager.displayMessage(batch);

И по традиции нужно избавиться от текстуры кнопки назад, когда она нам уже будет не нужна. Делаем это в методе dispose():

ballTexture.dispose();
backButtonTexture.dispose();

Теперь нам нужно обработать касание/нажатие по кнопке «Назад» так, чтобы она направляла нас обратно на экран меню. Добавим метод handleBackButton() в класс InputManager. В этом методе осуществим проверку нажатия/касания кнопки «Назад» и дальнейшую установку экрана меню:

        return false;
    }

    public void handleBackButton(float touchX,float touchY){
        // обработка касания/нажатия кнопки "Назад"
        if((touchX>=GameManager.backButtonSprite.getX()) && touchX <=(GameManager.backButtonSprite.getX()+GameManager.backButtonSprite.getWidth()) && (touchY>=GameManager.backButtonSprite.getY()) && touchY<=(GameManager.backButtonSprite.getY()+GameManager.backButtonSprite.getHeight()) ){
        BasketBall.game.setScreen(new MenuScreen(BasketBall.game)); // устанавливаем экран меню
        }
    }
}

Этот метод будем вызывать в методе touchUp() класса InputManager:

GameManager.basket.handleTouch(touchX, touchY);
handleBackButton(touchX, touchY);
return false;

Теперь нужно вызвать метод dispose() в методе hide() в классе BasketBall:

@Override
public void hide() {
    dispose();
}

Теперь ваша игра должна выглядеть так:

кнопка назад в libgdx android studio

«Ловим» нажатие по кнопке «Назад» вашего устройства

Каждый раз, когда пользователь нажимает на Android-устройстве системную кнопку «Назад» происходит закрытие приложения. Такое поведение в ОС Android закреплено по умолчанию. Нам же нужно, чтобы по нажатии этой кнопки в тот момент, когда мы находимся в игре, нас перекидывало на экран меню. Для этого нужно, чтобы ОС передала управление этим событием (нажатие по системной кнопке «Назад») нашему приложению для того, чтобы мы могли это событие переопределить (override). Для этого в методе initialize() класса GameManager добавьте следующую строчку кода:

score=0;

Gdx.input.setCatchBackKey(true); // ловим касание по системной кнопке "Назад"

prefs = Gdx.app.getPreferences("My Preferences"); //получаем файл персональных данных

Теперь мы можем в классе InputManager реализовать обработку касания по системной кнопке «Назад»:

return false;
}

@Override
public boolean keyUp(int keycode) {
    if(keycode== Input.Keys.BACK){
        BasketBall.game.setScreen(new MenuScreen(BasketBall.game)); // Переход к экрану меню
    }
    return false;
}

public void handleBackButton(float touchX,float touchY){

Метод keyUp получает в качестве аргумента кодовое значение кнопки/клавиши. Далее идет проверка условия равенства кодового значения нажатой кнопки/клавиши системной кнопке «Назад» и если равенство верно, то идет переход на экран меню. Следующая диаграмма наглядно иллюстрирует процесс:

переключение экранов в libgdx android studio

А вот и результат вышеописанных действий:

черные квадраты в libgdx

Вы можете заметить, что при повторном нажатии кнопки Start вместо мячиков отображаются черные квадраты. Происходит это потому что мы с вами избавляемся (dispose) от всех текстур при переключении экрана игры на экран меню, а при повторном переходе в экран игры мы не устанавливаем новые позиции для появления мячиков, а пользуемся старыми. Получается, что мы отображаем текстуру мяча, от которой избавились (dispose). Чтобы избежать такую ситуацию, нужно заново устанавливать позиции мячей. Это можно сделать разными способами. Мы справимся следующим образом — будем очищать массив мячей в методе dispose() класса GameManager:

ballTexture.dispose();
backButtonTexture.dispose();

balls.clear();

}

Теперь мячи каждый раз при запуске будут падать сверху:

кнопка назад в Libgdx android studio

Код для этого урока можно скачать ниже:

Скачать исходники