Igorek, пытался воспроизвести модуль математики.
Получилось.
Игрок двигается нормально и правильно.
Я тоже делал похожий модуль где-то с год назад, но на этом и остановился из-за того, что не смог понять, как сделать рассчёт для координат звуков.
Дальше сделал функцию для вычисления координат звука, как вы описывали выше, но тут начались проблемы.
Вот код:
#include"screen reader.bgt";
#include"sound_positioning.bgt";
//вектор слушателя
vector i(0, 0, 0);
//вектор звука
vector se(1, 1, 0);
//поворот слушателя
double turn=0;
const double PI=3.14159;
sound e;
void main() {
show_game_window("vectors");
//это из моего модуля для скрин ридеров. (неважно)
set_screen_reader("nvda.dll");
//загрузка звука
e.load("e.wav");
//вектору звука присваивается позиция относительно слушателя
se=ssp(se, i, turn);
//апдейт звука
position_sound_2d(e, i.x, i.y, se.x, se.y, 1, 1, 1);
e.play_looped();
while(true) {
//движение слушателя по стрелке вверх
if(key_pressed(KEY_UP)) {
//gnv - функция нормализации вектора по градусам
i+=gnv(turn);
//опять высчитываем позицию звука, исходя из новых координат слушателя
se=ssp(se, i, turn);
//апдейтим звук
position_sound_2d(e, i.x, i.y, se.x, se.y, 1, 1, 1);
}
if(key_pressed(KEY_RIGHT)) {
//здесь поворот слушателя и тоже апдейт координат звука и апдейт звука
turn=turnright(turn, 15);
se=ssp(se, i, turn);
position_sound_2d(e, i.x, i.y, se.x, se.y, 1, 1, 1);
}
if(key_pressed(KEY_LEFT)) {
//тоже самое, только в левую сторону
turn=turnleft(turn, 15);
se=ssp(se, i, turn);
position_sound_2d(e, i.x, i.y, se.x, se.y, 1, 1, 1);
}
//это из моего модуля скрин ридеров. узнаю свой поворот и координаты
if(key_pressed(KEY_V))
srspeak(turn);
if(key_pressed(KEY_C))
srspeak(i.x+", "+i.y+", "+i.z);
if(key_pressed(KEY_ESCAPE))
exit();
wait(5);
}
}
//функция нормализации с градусами
vector gnv(double a) {
double r=a*PI/180;
return vector(sine(r), cosine(r), 0);
}
//функция нормализации градусов, чтобы не вышли за 360 и в минус
double nd(double a) {
if(a<0 or a>359) {
a%=360;
if(a<0)
a+=360;
return a;
}
return a;
}
//функция поворота
double turnright(double a, double p) {
a+=p;
return nd(a);
}
double turnleft(double a, double p) {
a-=p;
return nd(a);
}
//функция нормализации вектора
vector nv(vector v) {
return v/v.length();
}
//вот самое интересное. функция рассчёта координат звука.
//параметры: вектор звука, вектор слушателя, поворот слушателя
vector ssp(vector s, vector l, double a) {
//нормализация вектора звука
s=nv(s);
//дальше всё, как вы описывали в предыдущем сообщении
double r=nd(a)*PI/180;
double sx=(s.x-l.x)*cosine(r)-(s.y-l.y)*sine(r);
double sy=(s.y-l.y)*cosine(r)+(s.x-l.x)*sine(r);
//возвращаем конструктор вектора с заданными координатами, которые только что вычислили
return vector(sx, sy, 0);
}
В итоге звук крутится, но как-то странно. Сначала он стоит на координатах 1, 1, если внимательно слушать.
Потом я увожу слушателя на 10 шагов по оси y, звук отдаляется назад, с этим всё правильно.
Но потом я начинаю поворачиваться. Повернулся на 90 градусов, звук оказался справа. Всё правильно.
Потом я поворачиваюсь на 180 градусов, и звук по слышомости стоит прямо передо мной, хотя я,по идее, нахожусь от него в 10-ти шагах.
Кручусь дальше.
Потом всё работает закономерно, пока опять не повернусь лицом к звуку. Опять он звучит очень громко, стоя передо мной.
Вы можете помочь с этой проблемой?