Есть много продвинутых способов создать иллюзию расстояния и направления с помощью звука в видеоиграх, но в этой статье мы рассмотрим только самый простой способ сделать это: расстояние. Я использую LibGDX для своего звука, но этот метод применим повсеместно, если у вас есть возможность изменять громкость уже исполняемого звука. Поскольку я пытаюсь охватить концепцию, а не конкретный код, в этом руководстве предполагается, что вы уже знакомы с основами LibGDX Sound.

public long play2D(int sound, float x1, float y1, float x2, float y2, int range, float vol, float pitch, логический цикл) {

float d = Vector.distance(x1, y1, x2, y2);

float p = 1 — ((d * d) / ((float) ((range * 32) * (range * 32))));

if (p < 0) {

вернуть -1;

}

long soundID = getSnd(sound).play(p * vol, pitch, 0);

getSnd(sound).setLooping(soundID, loop);

возвратить soundID;

}

Поскольку интенсивность естественного звука обратно пропорциональна квадрату расстояния, мы можем применить формулу, чтобы получить громкость на разных расстояниях. Но нам нужно откалибровать его в диапазоне. В моей игре используются тайлы, поэтому было проще определить диапазон в тайлах, но они составляют 32 пикселя, а x1,x2,y1,y2 напрямую коррелируют с расстоянием в пикселях. В конце концов, p содержит значение от 0 до 1, представляющее вашу близость к источнику звука. Мы просто подключаем p к нашей звуковой функции и вуаля!

Но это работает только для очень коротких звуков. Я использую 7-секундный цикл для своих костровых ям, поэтому нам нужно периодически пересчитывать p и соответствующим образом регулировать громкость.

public void updateSound (long soundID, int sound, float x1, float y1, int x2, int y2, int range, float vol, float pitch, логический цикл) {

float d = Vector.distance(x1, y1, x2, y2);

с плавающей точкой p = 0;

p = 1 — ((d * d) / ((float) ((range * 32) * (range * 32))));

if (p < 0) {

возврат

}

getSnd(sound).setVolume(soundID, p * vol);

}

То же самое здесь. в LibGDX обновление громкости звука каждый кадр оказывалось огромным замедлением. Я выясняю, почему, но в то же время я обновляю его только каждые 200 мс для большего эффекта.

Я экспериментировал с некоторыми методами имитации 2D-звука. На компьютере или консоли можно с уверенностью предположить, что ваш плеер воспроизводит стереозвук, поэтому разработчики смартфонов могут пропустить эту часть.

Влево и вправо, очевидно, легко, потому что у вас есть панорамирование, но вверх и вниз немного сложнее. Я экспериментировал с небольшой модуляцией высоты тона и регулировкой панорамы и модифицировал вышеуказанные функции, чтобы также вычислять направление. Результат был неестественным, но игроки могли точно определить, откуда исходит звук. Для звука на границе слышимости над вами или под вами высота тона была изменена на +/- 10%. Даже если эффект немного неестественен, игроки быстро адаптируются к модуляции высоты тона и могут точно определить источник звука.

В будущем я опубликую код того, как я этого добился, но этот касается только расстояния и объема.