libGDX. Урок 5. Кнопка restart. Установка фона (background)

Реализация кнопки restart

Добавим в нашу игру возможность перезагрузки игры. Для этого нам потребуется отобразить кнопку перезагрузки и запрограммировать её функционал. Изображение кнопки должно быть уже добавлено в ваш проект Android Studio в папку assets (restart.png).

 
Теперь нужно объявить sprite – дать ему имя restartSprite и передать этому sprite’у соответствующую текстуру (texture). Также объявим константу (constant) под названием RESTART_RESIZE_FACTOR. Эту переменную будем использовать для изменения размера кнопки под различные разрешения различных устройств. Инициализация sprite и установка его параметров будет происходить в классе GameManager. Для начала объявим нужные нам переменные:

static IntArray goatIndices; // массив целых чисел для хранения индексов дверей с козами

static Sprite restartSprite;
static Texture restartTexture;
static final float RESTART_RESIZE_FACTOR = 5500f;

private static final float DOOR_RESIZE_FACTOR = 2500f;

В методе initialize() класса GameManager напишем следующий код:

restartTexture = new Texture(Gdx.files.internal("restart.png"));
restartSprite = new Sprite(restartTexture);
restartSprite.setSize(restartSprite.getWidth()* width/RESTART_RESIZE_FACTOR,restartSprite.getHeight()* width/RESTART_RESIZE_FACTOR);
restartSprite.setPosition(0 ,0);

Отрисовка restartSprite будет происходить в методе renderGame():

TextManager.displayMessage(batch);
restartSprite.draw(batch);

А теперь напишем метод для обработки касания игроком кнопки перезагрузки. Мы создадим новый метод с именем handleRestart() в классе InputManager:

    public static void handleRestart(float touchX,float touchY) {
    // определяем, было ли касание кнопки restart, используя границы спрайта
    if ((touchX >= GameManager.restartSprite.getX()) && touchX <= (GameManager.restartSprite.getX() + GameManager.restartSprite.getWidth()) && (touchY >= GameManager.restartSprite.getY()) && touchY <= (GameManager.restartSprite.getY() + GameManager.restartSprite.getHeight())) {
        GameManager.restartGame();
    }
}

Этот метод мы будем вызывать в теле метода handleInput(). В качестве аргументов будем передавать координаты касания – touchX и touchY:

        handleRestart(touchX,touchY);
    }
} // конец метода handleInput()

Как только будет определено, что по кнопке restart было произведено касание, тут же будет вызван метод restatrGame, который мы сейчас создадим в классе GameManager:

public static void restartGame(){
    // перетасуем позиции дверей в массиве doors, используя метод shuffle
    doors.shuffle();
    // переустановим позицию каждой двери
    doors.get(0).position.set(width/DOOR1_HORIZ_POSITION_FACTOR,height/DOOR_VERT_POSITION_FACTOR);
    doors.get(1).position.set(width/DOOR2_HORIZ_POSITION_FACTOR,height/DOOR_VERT_POSITION_FACTOR);
    doors.get(2).position.set(width/DOOR3_HORIZ_POSITION_FACTOR,height/DOOR_VERT_POSITION_FACTOR);

    for(int i=0;i<GameManager.doors.size;i++){
        GameManager.doors.get(i).isOpen = false;
        // переустановим позициии спрайтов
        GameManager.doors.get(i).closeSprite.setPosition(GameManager.doors.get(i).position.x, GameManager.doors.get(i).position.y);
        GameManager.doors.get(i).openSprite.setPosition(GameManager.doors.get(i).position.x, GameManager.doors.get(i).position.y);
    }

    GameManager.hasWon = false;
    // перезагрузим игру
    GameManager.level = GameManager.level.START;
    TextManager.confirm = new StringBuffer( (String) "You selected door no.Do you want to switch or stay?");
}

Мы вызываем метод shuffle() на наш массив doors. Делается это для того, чтобы каждый раз, когда мы перезагружаем игру (по кнопке restart) наши двери располагались в разном порядке.

array shuffle

После чего в цикле for для каждой двери мы сначала присваиваем переменной isOpen значение false, таким образом сделав их закрытыми, что является начальной конфигурацией игры. Позиции sprite’ов также возвращаем к их начальному состоянию. И в конце метода сбрасываем значение переменной hasWon на false, строку состояния CONFIRM к исходному тексту, а состояние игры в START.

Ну и наконец мы должны уничтожить (dispose) restartTexture. Делаем это в методе dispose():

restartTexture.dispose();

 

Отображение фона (background)

Мы реализовали много функций в этой игре и вишенкой на торте должен быть задний фон (background). Чтобы реализовать фон сделаем несколько манипуляций. Для начала в классе GameManager объявим необходимые переменные:

static final float RESTART_RESIZE_FACTOR = 5500f;

static Texture backtexture;
static Sprite backSprite;

private static final float DOOR_RESIZE_FACTOR = 2500f;

В методе initialize() класса GameManager добавим следующий код:

restartSprite.setPosition(0 ,0);

backtexture = new Texture(Gdx.files.internal("background.jpg"));
backSprite = new Sprite(backtexture);
backSprite.setSize(width, height);
backSprite.setPosition(0,0f);

doorTexture = new Texture(Gdx.files.internal("door_close.png"));

Чтобы фон занимал весь экран устройства, на котором будет запущено приложение, мы установим значения переменных width и height такими же, как и значения нашей области просмотра игры. Теперь нужно отрисовать фон в методе renderGame() (делать это нужно первой строкой в методе, так как если вы отрисуете фон в конце метода, то он перекроет все остальные объекты):

backSprite.draw(batch);
//Отобразить(нарисовать) каждую дверь

Наконец, нам нужно избавиться от текстуры в методе dispose():

backtexture.dispose();

Вот, что должно у вас получится:

android app libgdx

Итого

Мы научились создавать проект с помощью libGDX и создали простую игру-приложение для Android. Узнали некоторые концепции libGDX, такие как:

  • Отрисовка изображений;
  • Обнаружение касаний по экрану;
  • Отображение текста.

В следующих уроках вы получите еще больше знаний о возможностях libGDX и создании игр в частности. Переходите к следующему уроку для создания новой игры с помощью libGDX.

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

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