Часть №11: Добавление аудио в игру «Breakout» на C++/OpenGL

  Дмитрий Бушуев  | 

  Обновл. 20 Дек 2020  | 

 2698

 ǀ   2 

Несмотря на то, что наша игра практически завершена, она все еще выглядит немного «пустой», ведь у нее нет никаких звуковых эффектов. Сейчас мы это исправим.

OpenGL не предлагает никакой поддержки звуковых возможностей (и не только их). Мы должны вручную загружать аудиофайлы в коллекцию байтов, обрабатывать и преобразовывать их в аудиопоток, а также организовывать управление несколькими аудиопотоками. От этих действий код очень быстро становится запутанным и усложненным, к тому же требуется обладать определенными знаниями в области обработки звука.

Хотя, если описанные процессы не вызывают у вас затруднений, то не стесняйтесь вручную загружать аудиопотоки из одного или нескольких форматов аудиофайлов. Мы же, однако, собираемся использовать библиотеку под названием irrKlang.

Библиотека irrKlang

irrKlang — это высокоуровневый 2D/3D кроссплатформенный (Windows, macOS, Linux) звуковой движок и аудиобиблиотека, которая может воспроизводить файлы таких форматов, как: WAV, MP3, OGG и FLAC. Она также имеет поддержку нескольких звуковых эффектов: реверберации, задержки и искажения.

Примечание: Под термином «3D-звук» подразумевается, что громкость аудиоисточника будет ослабляться с ростом расстояния от него до наблюдателя, в результате чего появляется ощущение настоящего пространственного звучания (представьте себе стрельбу в 3D-мире; чаще всего, вы сможете определить место выстрела просто по направлению/местоположению дошедшего до вас звука).

irrKlang — это простая в использовании аудиобиблиотека, которая может воспроизводить содержимое аудиофайлов самых разнообразных форматов с помощью всего нескольких строк кода, что делает её идеальным вариантом для нашей игры. Обратите внимание, что irrKlang имеет несколько ограниченную лицензию: вам разрешено использовать библиотеку по своему усмотрению только в некоммерческих целях, в противном случае необходимо будет приобрести pro-версию.

Вы можете скачать irrKlang с официального сайта; для этого урока мы будем использовать версию 1.6. Поскольку библиотека является продуктом с закрытым исходным кодом, то мы не можем скомпилировать её самостоятельно, поэтому придется использовать то, что предоставили нам разработчики. К счастью, у них есть много предварительно скомпилированных библиотечных файлов.

После того, как вы подключите заголовочные файлы irrKlang, добавьте в настройки линкера своего проекта (64-битную) библиотеку (irrKlang.lib) и скопируйте dll-файлы в соответствующие папки проекта (обычно, в то же место, где находится файл .exe). Обратите внимание, если вы хотите загрузить MP3-файлы, то вам также придется добавить файл ikpMP3.dll.

Добавление фоновой дорожки


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

Добавить трек в игру «Breakout» очень просто. Мы подключаем заголовочный файл irrKlang.h, создаем объект класса irrKlang::ISoundEngine, инициализируем его с помощью функции createIrrKlangDevice(), а затем уже с помощью движка загружаем и воспроизводим аудиофайлы:

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

И это всё, что нужно сделать! Теперь запуск игры должен привести к тому, что ваши динамики (или гарнитура) будут яростно воспроизводить фоновую музыку.

Добавление звуков

Мы хотим, чтобы всякий раз, когда в игре происходит что-то интересное (мяч ударился о кирпич или активировался бонус), игрок получал дополнительную обратную связь в виде воспроизведения соответствующих звуков. Ниже вы можете найти все звуки, которые мы собираемся использовать (любезно предоставленные сайтом freesound.org):

   bleep.mp3 — звук, когда мяч попадает в нетвердый блок:

   solid.wav — звук, когда мяч попадает в твердый блок:

   powerup.wav — звук, когда ракетка игрока подбирает бонус:

   bleep.wav — звук, когда мяч отскакивает от ракетки игрока:

Где бы ни произошло столкновение, мы воспроизводим соответствующий звук. Я не буду описывать все строки кода, где это должно произойти, а просто ниже прикреплю обновленный файл game.cpp:

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

Библиотека irrKlang позволяет гораздо более тонко управлять воспроизведением звука, используя для этого такие механизмы, как: расширенное управление памятью, аудиоэффекты или callback-функции звуковых событий.

  GitHub / Часть №11: Добавление аудио в игру «Breakout» на C++/OpenGL — Исходный код


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 2

  1. Никита:

    в скачанной библиотеке в lib только версия visualstudia, но я работаю в codeblocks, что делать ? Прописал в linker settings файл lib , но компилятор ругается на строчки "namespace irrklang" в заголовочных файлах

    1. Elijah:

      irrKlang заточена под Visual Studio, по крайней мере в части бесплатного использования.
      Попробуй использовать в качестве альтернативы например SFML. Там всё сложнее с линковкой и прикручиванием библиотеки к проекту и отсутствует возможность работы с mp3, но в целом использовать довольно просто.
      Сам пользовал её в связке Eclipse + GCC(v.10…). Но думаю с CodeBlock тоже пойдет.
      Как линковать библиотеку (в частности нужна sfml-audio) и примеры использования есть на оффициальном сайте. С линковкой конечно посложнее, но разобраться можно.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *