BGT — позиция звука

Всем привет, и сегодня мы попробуем работать с позиционным звуком в BGT.
Дело это несложное, но сразу можно и не понять.
Позиционный звук нужен, чтобы создавать 1D, 2d и 3d игры, такие как super leam, 2D platformer, 3d platformer и так далее.
Нашей задачей сегодня будет научиться делать позиционный звук в 1d и 2d играх.
Чтобы работать с 3D звуком, нужна отдельная библиотека, так как в BGT её нету.
Но думаю, что пока вам хватит и первых двух встроенных.
Давайте объясню, что представляет из себя 1D звук.
Вы, наверное, играли в игры такого известного жанра, как сайд-скроллеры.
Там вы бегаете только в две стороны. Влева и вправа.
Так вот, для таких игр чаще всего используют 1D-позиционирование, и очень кстати зря.
Если использовать 2D, то игра будет реалистичнее. 1D — позиция звука происходит только по левому и правому каналам. Тоесть, если ваш персонаж в игре прыгнет вверх, чтобы перепрыгнуть яму, то звук ямы не уменьшится, как он сделал бы это при 2D позиции.
Поэтому я советую вам всегда использовать 2D позицию звука, чтобы игра была намного интереснее.
Давайте напишем такую игру не игру, но скрипт, где наш персонаж будет двигаться по четырём сторонам, вокруг него будет несколько звуковых объектов.
Создадим очередную папку, в которой создадим наш файл к примеру game.bgt.
В эту папку поместите несколько звуковых файлов, например несколько звуков каких-либо оборудований, компьютеров, сигнализаций, писков, свисто, чтобы они звучали достаточно громко, но при этом постоянно. Можно использовать какие-либо гудения и тому подобные звуки.
Также нам понадобятся звуки шагов персонажа. Помните, мы делали это, когда делали нашу брадилку?
Ну закидываем несколько звуков шагов одного типа.
Всё, можно приступить.
Открываем наш файл через блокнот и пишем.
Сначала нам надо загрузить стандартную библиотеку BGT, позволяющую работать с позиционным звуком.
Пишем так:
#include»sound_positioning.bgt»;
Все стандартные библиотеки находятся в папке include, в папке bgt.
Вы можете все их просмотреть, если интересно.
Теперь создадим несколько звуковых объектов.
К примеру, если вы в папку копировали 5 звуковых объектов, то вам надо 5 их саундов.
Пусть у нас к примеру будет 5 звуковых объекта.
sound object1;
sound object2;
sound object3;
sound object4;
sound object5;
Ещё нужен звук шагов.
sound step;
После создания объектов, нам нужны ещё координаты каждого объекта.
int o1_x = random(1, 50);
int o1_y = random(1, 50);
int o2_x = random(1, 50);
int o2_y = random(1, 50);
int o3_x = random(1, 50);
int o3_y = random(1, 50);
int o4_x = random(1, 50);
int o4_y = random(1, 50);
int o5_x = random(1, 50);
int o5_y = random(1, 50);
Конечно процесс размещения объектов подобным образом слишком долгий, но в следующих статьях я покажу, как сделать несколькими строчками кучу объектов.
Кстати забыл сказать, что наше поле, по которому игрок будет бегать, 50 на 50 клеток.
А координаты всех объектов я указал случайным образом от 1 по 50.
То есть все объекты разместятся случайным образом по всему полю.
Теперь нам нужны координаты нашего игрока.
int x = 1;
int y = 1;
Теперь нам нужен таймер шагов. Мы уже делали такое в прошлой статье.
timer steper;
Вроде всё готово для того, чтобы приступить к главной функции.
void main() {
теперь загружаем все наши звуки.
object1.load(«object1.wav»);
Кстати забыл сказать: советую назвать все звуковые файлы в папке так: object1.wav, object2.wav и так далее. Ну так удобнее просто.
object2.load(«object2.wav»);
object3.load(«object3.wav»);
object4.load(«object4.wav»);
object5.load(«object5.wav»);
Фух, мы загрузили все звуки.
show_game_window(«позиция звука»);
while(true) {
Сначала напишем код перемещения игрока.
if(key_down(KEY_UP)) {
if(steper.elapsed>200) {
y+=1;
int rand = random(1, 3);
Предполагается, что у вас 3 звука шагов.
step.load(«step»+rand+».wav»);
step.play();
steper.restart();
Мы перезапустили таймер, чтобы он пошёл на второй раз и на третий и на так далее.
Чтобы в общем не застывал после первого истечения.
}
}
if(key_down(KEY_DOWN)) {
if(steper.elapsed>200) {
y-=1;
int rand = random(1, 3);
step.load(«step»+rand+».wav»);
step.play();
steper.restart();
}
}
Тоже самое сделайте и с x.
Теперь оградим нашего игрока.
if(x50) {
x-=1;
step.stop();
}
Сделайте тоже самое с y.
А теперь разместим наши объекты.
position_sound_2d(object1, x, y, o1_x, o1_y, 1, 1, 1);
Этот метод позволяет нам разместить объект по его имени, относительно каких-либо координат. В нашем случае это x и y.
Также нужно указать координаты самого объекта. На основе этих данных BGT устанавливает наш объект на указанных координатах, относительно игрока.
Ещё вы заметили 3 единички через запятую. Это настройки позиционирования. Советую вам с ними поиграться, например сделать не 1,1,1 , а 2,5,4.
Они изменяют приближение звука, понижение и повышение тона.
Теперь ещё раз напишу наш метод, но переведу на русский язык:
position_sound_2d(имя_звукового_объекта, Координата_игрока_x, координата_игрока_y, координата_объекта_x, координата_объекта_y, 1, 1, 1);
Ну думаю, что вы поняли позицию звука. Напишем этот же метод и для остальных звуковых объектов.
position_sound_2d(object2, x, y, o2_x, o2_y, 1, 1, 1);
position_sound_2d(object3, x, y, o3_x, o3_y, 1, 1, 1);
position_sound_2d(object4, x, y, o4_x, o4_y, 1, 1, 1);
position_sound_2d(object5, x, y, o5_x, o5_y, 1, 1, 1);
А теперь воспроизведём наши звуки на повтор.
object1.play_looped();
object2.play_looped();
object3.play_looped();
object4.play_looped();
object5.play_looped();
Вот теперь наши объекты звучат, раскиданные по всему полю.
Ну и не забудем сделать выход.
if(key_pressed(KEY_ESCAPE)) {
exit();
}
}
}
Вот и всё в принципе, что хотелось сказать про позицию звука.
В следующих статьях я опишу, как можно работать с другой библиотекой BGT, где вам даже ненужно создавать звуковой объект, а загружать файл сразу, так сказать без посредников. И настройки там намного удобнее.
Практикуйтесь в позиции звука, если что непонятно, оставляйте комментарии, либо пишите на Anton.Bogatov@list.ru
Всем удачи!