BGT. Делимся опытом: кодинг, решения задач в программировании. (Страница 4) — Создание игр, программирование — Blind games - Звуковые игры незрячим

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Перейти к содержимому раздела

Blind games - Звуковые игры незрячим

Форум сайта "blind.games". Добро пожаловать.

Архивный режим

Форум переводится в архивный режим. Это значит, что все учетные записи, темы и сообщения остаются на момент 19.07.2018, а добавлять новые уже нельзя. То есть, закрыта регистрация, добавлен запрет на создание новых тем и ответы в существующих.
По всем вопросам, как и ранее, вы можете писать на support (собачка) blind (точка) games.

(Страница 4 из 4)

Blind games - Звуковые игры незрячим → Создание игр, программирование → BGT. Делимся опытом: кодинг, решения задач в программировании.

Страницы Назад 1 2 3 4

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Topic RSS feed

Сообщений с 31 по 40 из 40

31 (Sat-10-17 22:18:23 отредактировано fenix)

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

чёрный сталкер пишет:

Ну в BGT дескрипторы это которые с собачкой, а ссылки, это я сам до конца не понял что, вобщем их можно использовать только в функциях, там перед именем параметра используется амперсант, хотя я их никогда не использовал

Я тестировал ссылки, можно в функции передавать саму переменную, или её значение. Когда передаём по значению то получается создаётся новая переменная, как бы копия той, что пришла во входных параметрах. Попробовал простые переменные передавать по значению и по ссылке, изменял внутри функции, в итоге если по значению передаём и изменяем, то основная переменная не изменяется. Честно практических плюсов не нашёл.
Можно сделать так, создаём внутри функции например 3 переменных, отправляем в другую функцию по ссылке, вторая их меняет, в первой функции они тоже поменяются, может это где-то нужно...
Понятно, что можно использовать глобальные переменные, видимо глобальные память занимают всегда, а тут можно эффективнее писать, но по мне - это незачем.
Вот когда передаём объекты, тут наверно на памяти с помощью ссылок можно сильно так экономить, но так как я практически везде использую дескрипторы, а дескрипторы объектов почти ничего не весят, то получается что при передаче дескрипторов объектов почти то же самое что передача по ссылке.
вообще ссылки и дескрипторы очень похожи, дескриптор есть указатель на область памяти, дескриптор функции - указатель на функцию, ссылка, как понимаю тоже указатель, только сформулировать не могу,, видимо что то типа способ обработки, использовать саму переменную или его копию.

Хорошо(+) Плохо(-)

32

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

Написал про сериализацию объектов.

https://yadi.sk/d/Yu3vsm0h3NBDRV

Хорошо(+) Плохо(-)

33

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

Igorek пишет:

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

У меня есть функция, которая возвращала поверхность на определённой клетки, она принимала строку, содержащую все поверхности и 3 координаты, x , y и z, потом она пилила эту строку и искала там эти коры, работало нормально, но до определённого момента, когда появилось много объектов, которые часто проверяли поверхность пошли сильные лаги, я решил ускорить эту функцию, хотел дескрипторы, но почему-то не получилось, а с ссылками всё норм работает, переменная не копируется в функцию а сразу обрабатывается, и это работает гораздо быстрее.

34 (Tue-02-18 18:40:12 отредактировано Igorek)

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

Видимо дескрипторы не допилены, и простые типы можно передавать только по значению. жалко, что bgt не стали развивать.
передавать огромную строку по значению много раз не эффективно, выручают ссылки, но тогда надо строку обернуть в класс, я понимаю, что вы так и сделали. быстродействие увеличит, если вы не будете каждый раз пилить строку, а распилите её 1 раз и положите значения в трёхмерный массив, откуда все объекты будут получать поверхность местности гораздо быстрее.
а вообще с ссылками тоже надо быть осторожными, когда набирается много пустых переменных, то bgt автоматически очищает мусор, что приводит к лагам. создавать ссылки на объект внутри функции плохо, если вызвать её много раз, то объекты будут создаваться в памяти на новом месте, а bgt это потом будет счищать. тут лучше по значению объекты создавать, ведь для них будет выделено определённое количество памяти в стеке, и при многократном вызове функции, объект будет создаваться на том же месте, мусора не будет.

Хорошо(+) Плохо(-)

35

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

igorek, хотел поинтересоваться насчёт статьи про линейную алгебру. не очень понял момент про модуль direction_vectors. как я понял, там массив из векторов по градусам, но у меня вопрос, как вычислить такой вектор, скажем, для 23 градусов?

36

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

asffix пишет:

igorek, хотел поинтересоваться насчёт статьи про линейную алгебру. не очень понял момент про модуль direction_vectors. как я понял, там массив из векторов по градусам, но у меня вопрос, как вычислить такой вектор, скажем, для 23 градусов?

Предупреждаю, что может быть функция get_angle не верно возвращает угол между точками, я этим вопросом должен был давно занятся но всё лень, пишу маяки в игре, по горячей клавише должно произносится направление в градусах до точки, а оказалось оно иногда врёт, буду разбираться, сюда отпишусь.
Да, использую массив, но его можно не использовать, как я писал, тригонометрические функции работают даже быстрее, подозреваю что это связано с вшитыми в процессоры тригонометрическими данными.
Чтобы находить нормализованый вектор направления, нужна такая функция

vector get_direction_vector(int angle) { // принимает угол взгляда в градусах, возвращает вектор направления с длиной 1, то есть нормализованный
double r = angle * 3.14159 / 180; // перевели угол взгляда в радианы
return vector(sine(r), cosine(r)); // в конструктор вектора передали синус от r и косинус от r то есть вычислили x и y вектора
}

Получаем таким образом вектора направления на плоскости, то есть не учитывается z вектора, z я не изучал, хоть и пишу 3d игру, но не хочу замарачиваться с наклонами относительно оси z.
входной параметр angle можно сделать нецелочисленным а например double, но для меня это лишнее.
если угол меньше нуля и больше 359 то должно работать всё равно хорошо, так как синус и косинус компьютер вычислит, но я бы следил чтобы не было выхода за пределы этого диапазона.
при переводе в радианы используется число PI, для меня 5 знаков после запятой достаточно, конечно можно подставить более точное число PI.
чтобы сделать шаг, нужно к вектору позиции прибавить вектор направления.

Хорошо(+) Плохо(-)

37

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

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-ти шагах.
Кручусь дальше.
Потом всё работает закономерно, пока опять не повернусь лицом к звуку. Опять он звучит очень громко, стоя передо мной.
Вы можете помочь с этой проблемой?

38

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

У вас позиция звука получает каждый раз новые координаты, повернулись на 15 градусов, позиция поменялась, в следующий раз вы повернулись ещё на 15 градусов, но в расчётную функцию передаётся уже 30, и она крутит ещё на 30, то есть лишнего, ну и так далее, крутиться по-моему звук должен с бешеной скоростью.
Считаю ошибкой приравнивание позиции звука, должна быть постоянная позиция звука, и каждый раз операться на неё, например звук на 1 1. всё, ничего не приравнивайте, просто на ней вычисляйте относительное положение и передавайте в обновление 2d.
второе очень важное, при вычислениях вы нормализуете позицию звука внутри функции ssp, это в корне не верно. то есть был звук на 3/4, после нормализации он станет 0.6/0.8, он станет ближе или дальше, смотря где находиться слушатель, ну и вообще на него направление будет не верное, это же новая точка, сместили просто позицию на несколько квадратов в сторону, при больших числах смещение будет увеличиваться.
Как я понял в этом коде с учётом нормализации позиции звука он должен быть всегда рядом со слушателем, ну или иногда рядом, видимо при поворотах бывает что звук оказывается громким, ведь растояние не верное.
Вообщем не приравнивайте к позиции звука ничего при вычислениях звука и не нормализуйте вектор позиции. просто вычисляйте относительные координаты звука по отношению к слушателю и передавайте их на обновление 2d.

Хорошо(+) Плохо(-)

39

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

igorek, всё исправил, но всё равно какая-то неточность присутствует.
во-первых, при повороте на 180 градусов звук не хочет совершенно никак двигаться. то есть, если взять мой пример, где звук находится на координатах 10, 0, то если я, стоящий на двух нулях, повернусь на 180 градусов, так, чтобы звук был точно слева, и пойду в отрицательные координаты, звук никуда исчезать не станет.
зато, если я начну разворачиваться обратно, звук тутже меняет своё положение, как будто только сейчас сообразил, что надо бы исчезнуть big_smile
блин, может я опять чего косякнул?
вот код.
#include"screen reader.bgt";
#include"sound_positioning.bgt";
vector i(0, 0, 0);
vector se(10, 0, 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");
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)) {
i+=gnv(turn);
vector a=ssp(se, i, turn);
position_sound_2d(e, i.x, i.y, a.x, a.y, 1, 1, 1);
}
if(key_pressed(KEY_RIGHT)) {
turn=turnright(turn, 15);
vector a=ssp(se, i, turn);
position_sound_2d(e, i.x, i.y, a.x, a.y, 1, 1, 1);
}
if(key_pressed(KEY_LEFT)) {
turn=turnleft(turn, 15);
vector a=ssp(se, i, turn);
position_sound_2d(e, i.x, i.y, a.x, a.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);
}
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) {
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);
}

40

Re: BGT. Делимся опытом: кодинг, решения задач в программировании.

Тут вроде всё правильно, вопрос к функции position_sound_2d, которую вы не показали.
В этой функции вычислять больше не нужно, уже получены относительные x и y, на основе x нужно установить панораму звука, на основе y можно изменить питч, например если y меньше нуля то изменить пичт, иначе оставить питч на отметке 100. Громкость нужно устанавливать опираясь на расстояние между точками.
Не знаю что значат в этой функции последние 3 параметра, но вот вместо x и y слушателя можно передать сразу расстояние.
// возвращает расстояние между двумя точками
double get_distance(vector v1, vector v2) {
return round((v1 - v2).length(), 2);
}
Нет разницы какой порядок векторов мы передаём, сначала слушателя а потом звук, или наоборот, но надо использовать настоящее положение звука а не вычисленный вектор a.
Кстати, если взять длину вектора a то это тоже будет расстояние до слушателя. тут выбирайте.
В-принципе, всё должно работать, если нет то покажите мне position_sound_2d.
Мелькнула мысль, если position_sound_2d берётся из других модулей, то её использовать нельзя, она же внутри себя что-то вычисляет, а мы уже всё вычислили, осталось только панораму громкость и питч установить как нам требуется, если это так, то пишите своё.

Хорошо(+) Плохо(-)

Сообщений с 31 по 40 из 40

Страницы Назад 1 2 3 4

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Blind games - Звуковые игры незрячим → Создание игр, программирование → BGT. Делимся опытом: кодинг, решения задач в программировании.



Currently installed 4 official extensions. Copyright © 2003–2009 PunBB.

Сгенерировано за 0.054 секунды (89% PHP — 11% БД) 12 запросов к базе данных