libGDX. Урок 10. Отображение результата (очков) и добавление звука.

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

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

 

static Texture stunTexture; //текстура для изображения оглушения
public static int score; // счетчик очков

В методе initialize() того же класса инициализируем переменную score:

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

    score=0;
    zombies = new Array<Zombie>();

Для удобства и для большей организованности нашего проекта создадим новый класс TextManager в пакете com.gdx.whackazombie.managers, который будет отвечать за отображение очков.

package com.gdx.whackazombie.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 ; // we draw the text to the screen using this variable // отображаем текст на экране через эту переменную
    // размеры области просмотра нашей игры
    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);

    }

}

Мы отобразим текст результата в правом верхнем углу. Осталось инициализировать класс TextManager в классе GameManager:

    TextManager.initialize(width, height);

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

А метод displayMessage() вызовем в методе renderGame() класса GameManager:

    for(Zombie zombie : zombies) {
        zombie.update();
        zombie.render(batch);
    }
    TextManager.displayMessage(batch);
} //конец метода renderGame()

И наконец, для корректного отображения очков, в классе InputManager мы должны увеличивать результат игрока с каждым побитым зомби:

for (int i = 0; i < GameManager.zombies.size; i++) {
    Zombie zombie = GameManager.zombies.get(i);
    if (zombie.state!= Zombie.State.STUNNED && zombie.handleTouch(touchX, touchY)) {
        GameManager.score++; // увеличиваем на единицу значение переменной score
        break;
    }
}

Сейчас ваша игра должна выглядеть так:

libgdx отображение текста

 

Добавляем звуковые эффекты

Сейчас мы с вами добавим звук, который будет слышен при каждом ударе по зомби. Звуковые эффекты, которые служат для таких целей обычно короткие. LibGDX поддерживает следующие три аудио-формата:

  • WAV: этот формат не требует лицензии для использования, но занимает большое количество памяти;
  • MP3: этот формат не занимает много места в памяти устройства, но потребуется лицензия для распространения;
  • OGG: этот формат не требует лицензии, не занимает много места в памяти, но не работает на iOS.

Для нашего с вами проекта на данный момент сгодится файл в формате WAV. Он уже должен у вас быть расположен в папке assets.

Давайте создадим переменную hitSound, которая будет хранить звуковой эффект в классе GameManager:

public static int score; // счетчик очков
public static Sound hitSound;

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

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

    hitSound = Gdx.audio.newSound(Gdx.files.internal("hit.wav"));

В методе handleTouch() класса Zombie мы будем проигрывать звук по касанию игрока зомби:

if((touchX>=position.x) &&touchX<=(position.x+width) && (touchY>=position.y) &&touchY<=(position.y+currentHeight) ){

        GameManager.hitSound.play();
        stunSprite.setPosition(position.x+width-(stunSprite.getWidth()/2), position.y+currentHeight -(stunSprite.getHeight()/2));

И в конце нужно избавить от экземпляра нашего звукового файла в методе dispose() класса GameManager:

public static void dispose() {
    // утилизация объектов, чтобы обеспечить отсутствие утечек памяти
    zombieTexture.dispose();
    backgroundTexture.dispose();
    holeTexture.dispose();
    stunTexture.dispose();
    hitSound.dispose();
}

Вы можете настраивать громкость звука передавая переменную типа float в метод play(). Переменная должна быть в пределах между 0 и 1. Например: GameManager.hitSound.play(volume);.

Если требуется больше контроля над определённым экземпляром звука для определенного зомби метод play() возвращает значение типа long: long id = GameManager.hitSound.play();.

Это значение служит идентификатором (id) для этого экземпляра, и вы можете управлять им. Чтобы манипулировать звуком, к примеру, вы можете вызвать следующий код:

GameManager.hitSound.stop(id); // для остановки экземпляра звука
GameManager.hitSound.setLooping(id,true); // для зацикливания проигрывания звука
GameManager.hitSound.setPitch(id,2); //настройка высоты звука в два раза выше оригинала

Итого:

В этой игру мы с вами научились таким аспектам игрового проектирования, как:

  • Анимация спрайтов;
  • Реализация времени ожидания;
  • Случайность времени ожидания (Random);
  • Добавление эффекта оглушения;
  • Добавление звукового эффекта.

В следующей игре, которая будет называться Catch the Ball мы изучим еще несколько концепций, такие как произвольный шрифт, сохранение наивысшего результата, игровая физика, меню игры и т.д.

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

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