libGDX. Урок 16. Отображение результата и замена шрифта

Отображение результата и Замена шрифта

В этом уроке мы научимся отображать игровой счет (очки) и сохранять лучший результат на экране устройства пользователя. Помимо этого, разберемся с отображением произвольного (скачанного, собственноручно изобретённого) шрифта.

Отображение результата

Мы хотим отслеживать количество пойманных пользователем мячей и отображать этот результат. Для начала нужно добавить новую переменную в класс GameManager – score:

public static Array<Ball> balls = new Array<Ball>(); // массив объектов ball
public static int score;

Инициализируем эту переменную значением 0 в методе initialize():

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

    score=0;
    basket = new Basket();

Не будем громоздить код в одном классе, а создадим новый, который и будет отвечать за отображение текста. Назовем его TextManager и создадим его в пакете com.mygdx.basketball.managers:

java class джава класс

java class

Скопируйте код для этого класса:

package com.mygdx.basketball.managers;


        import com.badlogic.gdx.graphics.Color;
        import com.badlogic.gdx.graphics.g2d.BitmapFont;
        import com.badlogic.gdx.graphics.g2d.GlyphLayout;
        import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class TextManager {

    static BitmapFont font; // отображаем текст на экране через эту переменную
    // размеры области просмотра нашей игры
    static float width,height;

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

        font = new BitmapFont();
        TextManager.width = width;
        TextManager.height= height;
        // устанавливаем цвет шрифта красным
        font.setColor(Color.RED);
        // масштабируем размер шрифта в соответсвии с шириной экрана
        font.getData().setScale(width/1000f);
    }

    public static void displayMessage(SpriteBatch batch){

        // объект класса GlyphLayout хранит в себе информацию о шрифте и содержании текста
        GlyphLayout glyphLayout = new GlyphLayout();
        glyphLayout.setText(font, "Score: " + GameManager.score);

        // отображаем результат в правом верхнем углу
        font.draw(batch, glyphLayout, width - width/15f, height*0.95f);
    }

}

Вызовем метод initialize() класса TextManager в методе initialize() класса GameManager:

    ballTexture = new Texture(Gdx.files.internal("ball.png"));
    SpawnManager.initialize(width, height, ballTexture);
    TextManager.initialize(width, height);

} // конец метода initialize()

А метод displayMessage() вызовем в методе renderGame():

public static void renderGame(SpriteBatch batch){

    backgroundSprite.draw(batch);
    basket.render(batch);
    TextManager.displayMessage(batch);

И чтобы счет увеличивался на единицу за каждый пойманный пользователем мяч нужно увеличивать переменную score каждый раз, когда происходит столкновение с корзиной. Добавьте эту строку в метод checkCollisionsWithBasket() класса Ball:

// проверка, было ли столкновение между мячом и корзиной
if(Intersector.overlaps(ballCircle, GameManager.basket.basketRectangle)){
    GameManager.score++;
    isAlive=false;

Запустив сейчас игру, вы увидите отображение количества пойманных мячей в правом верхнем углу:

libgdx android studio

Замена шрифта

В этом разделе разберемся как добавить в наш проект произвольный шрифт, к примеру, скачанный из интернета. В Android Studio имеется возможность пользоваться файлами с расширением .ttf, но libGDX такую поддержку не предоставляет. Для libGDX требуется иметь шрифт в формате растрового изображения (bitmap). Файл формата BitmapFont хранит каждый символ в качестве изображения. Это гораздо легче и эффективнее в сравнении с отображением .ttf-файла. Поэтому для начала нам нужно конвертировать файл формата .ttf в формат растрового изображения (bitmap). К счастью, для такого случая существует инструмент под названием Hiero, который сделает все за нас. Вы можете скачать Hiero по этой ссылке. Вы получите jar файл, который нужно открыть:

hiero libgdx android studio

В секции Font (1) присутствует область для загрузки файла .ttf формата. После того, как вы откроете нужный файл, то в секции Sample Text (2) вы увидите, как он выглядит по умолчанию, а в секции Rendering (3) то как он будет выглядеть в формате растрового изображения (bitmap). В конце урока вы можете скачать файл, в которому помимо кода будет файл appetitenew.ttf. Если этот шрифт вам не нравится, можете скачать любой, который вам нужен. В интернете их полным-полно. Поиграйте с настройками шрифта, добавлением к шрифту визуальных эффектов. Вот, что получилось у меня:

hiero libgdx android studio

После того, как вы получите понравившийся вам вид шрифта, нужно сохранить его File – Save BMFont files (text) и выберите куда хотите сохранить файл. Помимо файла формата .fnt Hiero создаст еще и файл формата .png. Теперь нужно скопировать оба этих файла в наш проект в папку assets:

hiero android studio libgdx

После чего необходимо поменять код. В классе TextManager в методе initialize() замените строчку кода, где мы создаём объект класса BitmapFont:

font = new BitmapFont();
font = new BitmapFont(Gdx.files.internal("appettitenew2.fnt"));

И нужно поменять значение масштабирования шрифта:

// масштабируем размер шрифта в соответсвии с шириной экрана
font.getData().setScale(width/1300f);

Получившийся результат вы можете увидеть на скриншоте. Заметьте, что эффект градиента (перепада цвета) не виден. Происходит это потому что в коде мы не стали убирать строку, в которой присваиваем объекту font класса BitmapFont красный цвет:

// устанавливаем цвет шрифта красным
font.setColor(Color.RED);

Если хотите увидеть шрифт с теми эффектами, которые вы присвоили ему в Hiero, то не нужно вносить никаких изменений в объект, который будет отвечать за вывод текста. В нашем случае можно просто закомментировать строку:

//font.setColor(Color.RED);

libgdx android studio приложение игра

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

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