В данном уроке мы рассмотрим скрипт, разработанный для RPG Maker MV и MZ одним хорошим человеком – Володей. Идея появилась уже давно, ещё пару лет назад при тесте одной игры, которая пыталась в Хоррор, но без атмосферы ничего не вышло. Но недавно, я вспомнил про энтити окружения в Вальве Хаммере, том самом, где делаю карты для Коунтер-Страйк. И подумал. Почему бы не сделать аналог на РПГ мейкере для того, чтобы событие при приближении к нему выводило определённый звук. Собственно, с этой идеей я обратился к коллеге по цеху, но как говорится «у дураков мысли сходятся», а значит он и без моей помощи задумался ровно о том же. Ну а моя просьба стала толчком к разработке.
По итогу, за пару дней, был разработан, протестирован и доведён до ума скрипт, который заставляет событие выводить звук BGS, когда игрок подходит в заданный от объекта радиус, не используя при этом ни переключателей, ни регионов или кода местности, опираясь лишь на расположение игрока и расположение события.
Для чего подобное вообще может быть нужно? Всё просто, создание атмосферы на карте, при помощи звука. Например: звук воды, фонтана, огня, каких-то животных или шепот людей, когда мы подходим к этим местам. Казалось бы, простейшая функция, но почему-то, даже в играх высокого уровня, с хорошими оценками от критиков и игроков, с высокими продажами в том числе, похожей атмосферной функции просто нет. А очень зря.
Вот и сам скрипт:
ВНИМАНИЕ: Спойлер![ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
var Radius = 8;
var Volume = 50;
var Pitch = 100;
var PanMultiplier = 2;
var Name = "Quake1"
var Pan = 0 + (($gamePlayer.x - $gameMap.event(this._eventId).x) * (Volume/Radius) * PanMultiplier);
var xDistance = $gamePlayer.x - $gameMap.event(this._eventId).x;
var yDistance = $gamePlayer.y - $gameMap.event(this._eventId).y;
if (xDistance < 0){var xDistance = xDistance * (-1)};
if (yDistance < 0){var yDistance = yDistance * (-1)};
var distance = xDistance + yDistance;
if (distance < Radius) {AudioManager.playBgs({ name: Name, volume: Volume - (distance * (Volume/Radius)), pitch: Pitch, pan: -Pan }) };
if (distance === Radius) {AudioManager.fadeOutBgs(1)};
И так, что нам надо, чтобы событие с этим скриптом заработало? Всё просто – выставить триггер на параллельно и вставить скрипт. Что примечательно, скрипт работает в RPG Maker MV и RPG Maker MZ.
Ну что, вот так будет выглядеть событие с этим скриптом. Оно работает, можно наслаждаться.
Но как его настроить под себя, что менять и куда писать?
Начнем с самого звука, в третьей строчке скрипта есть запись, которая отвечает за название файла звука. Var Name = “music”, файл данного звука берется из папки \audio\bgs вашего проекта. Указывать расширение файла при этом не надо.
Теперь нам нужно настроить радиус, в рамках которого и будет включаться данный фоновый звук. И тут нет особой науки, первая же переменная в скрипте отвечает за этот самый радиус, собственно – она так и называется var Radius. Чем выше радиус, тем соответственно дальше от события начинает проигрываться звук. Тут нужно учесть, что находиться в зоне действия сразу двух таких событий нельзя. Дело в том, что особенности РПГ Мейкера, в вопросе воспроизведения звуков, не позволяют проигрывать сразу два BGS или BGM звука, только один в один момент времени. Если игрок попадает в действие сразу двух таких событий, начинаются артефакты воспроизведения - на пересечении радиусов событий звук пропадает. Штука неприятная. Поэтому планируя локации, стоит быть внимательными к тому, где будут располагаться подобные ивенты.
Далее, значимым показателем может быть переменная volume – тут у нас возможность настроить громкость звука вначале радиуса, именно с этого показателя музыка начнет проявляться и увеличиваться до максимального значения ближе к расположению самого ивента
Переменная pitch, которая отвечает за скорость воспроизведения звука. Не вижу смысла тут менять значение, ведь замедлять или ускорять звук скорее всего - Вам будет не нужно.
А вот переменная PanMultiplier довольно занятная, она отвечает за силу эффект, который проявляется по мере приближения к событию с одной из конкретных сторон слева/справа. Тут у нас вступает в силу стерео-эффект, в зависимости от того, с какой стороны от игрока находится событие сила звука в соответствующем динамике будет сильнее на подходе к ивенту и выровнится только вблизи с ним. Чем выше значение этой переменной, тем более явным будет стерео-эффект.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Теперь давайте поговорим на конкретных примерах:
ВНИМАНИЕ: Спойлер![ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
На этой картинке видно, что есть некое событие внутри загона с курями. Именно оно воспроизводит звук кудахтанья птицы, когда игрок начинает подходить к загону. Особенностью можно назвать то, что радиус высчитывается как бы «ромбовидно», но это опять же особенности мейкера. В этом событии установлен радиус в 5 клеток, учитывая само событие, получается 11 клеток слева направо и снизу вверх и диагонали между этими вершинами. Именно в таком диапазоне тайлов начнётся работа скрипта и за его пределами она прекратиться.
Если же радиусы двух разных событий звука совпадут, будут артефакты связанные с одновременной попыткой мейкера запустить два BGS звука, что в рамках «чистого» движка невозможно, по этому напоминаю о том, что стоит планировать расположение подобных событий более грамотно.
Но у скрипта есть и ещё одна особенность, про которую можно случайно и забыть, что выльется в итоге, в небольшой косяк со звуком.
Давайте глянем на вторую картинку, чтобы понять о чем идёт речь. Вот она:
ВНИМАНИЕ: Спойлер![ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
Тут у нас загон со свинюшками, они погромче чем курицы и поэтому радиус значительно выше. Но если присмотреться, можно заметить, что действие события со звуком (под номером 1) распространяется и на уровень события двери (под номером 2). Дверь же активирует перенос персонажа внутрь дома. И логичный вопрос, а что будет с BGS звуком – ответ очевиден, он так и останется играть. Точнее, конкретно в этом случае персонаж при нажатии на событие двери будет вне зоны действия скрипта, но если персонаж сделает шаг в сторону двери, наступив при этом в зону работы скрипта, начнёт воспроизводиться звук. А так как персонаж вместе с этим перенесётся и на новой локации события отвечающего за проигрывание и отключение звука нет – то и отключиться BGS не сможет.
Разумеется, решить это можно правильным подбором радиуса действия события со звуком, либо принудительно выключать BGS звуки при перемещении игрока, что надёжнее.
Итог:
Скрипт довольно простой, но работает хорошо. Его основная функция это создание атмосферы на карте при помощи звуков, но использовать можно и совершенно в других целях, например создавать механики завязанные на умении персонажа слышать или квесты, в которых игроку придётся ориентироваться на звуки. Тут уж куда Вас заведёт фантазия.
З.Ы.
Тем же, кому удобнее воспринимать информацию в видео-формате на моём канале имеется и такой вариант. Встраиваю его сюды:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Последнее редактирование: 2 года 11 мес. назад от AnnTenna.
Мне тоже очень нравится нравиться твой канал, этот скрипт просто супер, я только не много его использовал в своей игре, но думаю, это будет ещё много раз
Последнее редактирование: 2 года 11 мес. назад от nirion.
Администратор запретил публиковать записи гостям.
Cкрипт на embient звук - мини урок
2 года 11 мес. назад #125358
Оказалось еще полезнее, чем я думал!
Выяснилось, логику дальности можно приспособить не только для звука, но и для оттенка экрана.
С этим, конечно, нужно хорошо поиграться...Но вот минимально-работающий пример кода.
код[ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
let Radius =6; let Volume =100; let Pitch =100; let PanMultiplier =2;let Name ="hearth";
let maxColor =255; let colorTurn =50; let Red =0; let Green =0; let Blue =0; let Grey =0;
let Pan =0+(($gamePlayer.x -$gameMap.event(this._eventId).x)*(Volume/Radius)* PanMultiplier);
let xDistance =$gamePlayer.x -$gameMap.event(this._eventId).x;
let yDistance =$gamePlayer.y -$gameMap.event(this._eventId).y;if(xDistance <0){xDistance = xDistance *(-1)};if(yDistance <0){yDistance = yDistance *(-1)};
let distance = xDistance + yDistance;if(distance < Radius){ AudioManager.playBgs({ name: Name, volume: Volume -(distance *(Volume/Radius)), pitch: Pitch, pan:-Pan });$gameScreen.startTint([(maxColor -(distance * colorTurn)), Green, Blue, Grey],1);}else{$gameScreen.startTint([Red, Green, Blue, Grey],1);};
Оказалось еще полезнее, чем я думал!
Выяснилось, логику дальности можно приспособить не только для звука, но и для оттенка экрана.
С этим, конечно, нужно хорошо поиграться...Но вот минимально-работающий пример кода.
код[ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
let Radius =6; let Volume =100; let Pitch =100; let PanMultiplier =2;let Name ="hearth";
let maxColor =255; let colorTurn =50; let Red =0; let Green =0; let Blue =0; let Grey =0;
let Pan =0+(($gamePlayer.x -$gameMap.event(this._eventId).x)*(Volume/Radius)* PanMultiplier);
let xDistance =$gamePlayer.x -$gameMap.event(this._eventId).x;
let yDistance =$gamePlayer.y -$gameMap.event(this._eventId).y;if(xDistance <0){xDistance = xDistance *(-1)};if(yDistance <0){yDistance = yDistance *(-1)};
let distance = xDistance + yDistance;if(distance < Radius){ AudioManager.playBgs({ name: Name, volume: Volume -(distance *(Volume/Radius)), pitch: Pitch, pan:-Pan });$gameScreen.startTint([(maxColor -(distance * colorTurn)), Green, Blue, Grey],1);}else{$gameScreen.startTint([Red, Green, Blue, Grey],1);};
Оказалось еще полезнее, чем я думал!
Выяснилось, логику дальности можно приспособить не только для звука, но и для оттенка экрана.
С этим, конечно, нужно хорошо поиграться...Но вот минимально-работающий пример кода.
код[ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ]
let Radius =6; let Volume =100; let Pitch =100; let PanMultiplier =2;let Name ="hearth";
let maxColor =255; let colorTurn =50; let Red =0; let Green =0; let Blue =0; let Grey =0;
let Pan =0+(($gamePlayer.x -$gameMap.event(this._eventId).x)*(Volume/Radius)* PanMultiplier);
let xDistance =$gamePlayer.x -$gameMap.event(this._eventId).x;
let yDistance =$gamePlayer.y -$gameMap.event(this._eventId).y;if(xDistance <0){xDistance = xDistance *(-1)};if(yDistance <0){yDistance = yDistance *(-1)};
let distance = xDistance + yDistance;if(distance < Radius){ AudioManager.playBgs({ name: Name, volume: Volume -(distance *(Volume/Radius)), pitch: Pitch, pan:-Pan });$gameScreen.startTint([(maxColor -(distance * colorTurn)), Green, Blue, Grey],1);}else{$gameScreen.startTint([Red, Green, Blue, Grey],1);};
Технически логика подходит для многих вещей, у нас уже есть скрип для плавного изменения прозрачности графики ивентов (8 ну а так, делать можно что угодно.
Жаль что на VX Ace такого нет) сам я пока нуб и не осилю такие вещи)
Хотя тоже задумывался о подобных вещах...
Мне вот интересно было бы узнать, как создать эффект 3D звука, чтобы ивент проигрывал его из места своего расположения, тем самым можно было на слух узнать где ивент находится. Разумеется не сильно далеко от игрока, например слышно только те ивенты, что рядом или за пределами экрана но не далее десяти клеток после того, как пропали за границей.
Последнее редактирование: 2 года 7 мес. назад от Sleeping Visitor.