Смена дня и ночи (RPG Maker 2003)
Статья рассчитана на людей, которые уже имеют определенное представление о RPG-Maker 2003. Также она может дать вам общее представление, каким образом делается смена дня и ночи. К статье прилагается демо-версия, в которой реализовано всё, что описано.
Для начала следует заметить, что такая система, как смена дня и ночи может быть в игре сделана совершенно по-разному, на RPG-мейкере существует десятки таких способов. Так что я уточняю, что буду рассказывать про свой способ. Сначала я думала, что эта статья будет посвящена смене дня и ночи именно в моей игре «Легенда о Дряньке». Но в процессе написания, я нашла у себя в скрипте некоторые неоптимальные вещи, так что решила, что буду рассказывать не точь-в-точь, как было сделано в игре, а так, как я считаю, следует сделать лучше всего.
Свойства.
Начну с элементарного вопроса: чем отличается в первую очередь день от ночи? Правильно - освещением! Днем, как правило, у нас светло, вечером начинает темнеть, а ночью совсем темно. Цвет экрана настраивается довольно просто.
Еще день и ночь имеют такое свойство, как последовательность. То есть: сначала светает, светло, темнеет, темно, светает, светло, темнеет, темно, светает.. что-то я увлеклась.. короче, и так далее. Для наглядности, условно разделим сутки на 4 части: утро, день, вечер и ночь. В «Дряньке» именно такое разделение. Но, вообще, никто не мешает разделить сутки на 2 части: темно и светло, например, или на 24 части по часам, но не будем усложнять…
Сейчас будет важный момент: для реализации смены ночи была использована всего одна переменная!
Назовем ее «смена дня и ночи». Она у нас будет принимать значения:
0 – утро
1 – день
2- вечер
3 - ночь
И, наконец, еще одно немаловажное свойство – это параллельность. День и ночь меняются всегда параллельно с любым происходящим, с течением времени.
Поэтому система смены дня и ночи будет организована у нас как параллельный процесс. Заходим в базу данных игры, открываем вкладку «Общие события».
Назовём событие «день и ночь». Вызывается оно параллельно в течении всей игры.
Отсчитываем время.
Как многие уже поняли, мы будем менять время, а когда пройдет нужный промежуток времени – менять время суток. Отсчет времени я делаю с помощью функции «Ждать».
По истечении нужного промежутка времени нам необходимо менять нашу переменную, и в результате, как мы потом увидим, освещение будет меняться.
Здесь я сначала проверяю, чему равно значение переменной, если оно меньше или равно двум, то у нас - утро, день или вечер, иначе – ночь. В зависимости от этого мы переходим либо дальше по кругу (плюс 1), либо возвращаемся в начало - если у нас сейчас ночь, то нужно перейти на утро. Затем мы должны некоторое время подождать. От того, сколько мы будем ждать единиц, будет зависеть скорость перехода. В данном тестовом варианте я задала значение специально небольшим, всего 50 секунд, чтобы было наглядно видно, как меняется день и ночь.
Таким образом, данная конструкция будет работать в цикле, меняя последовательно значения переменной «0001: Смена дня и ночи»
Делаем нужное освещение.
Но этого нам еще мало для счастья, потому что это не отражается у нас в игре. А для того, чтобы увидеть, как это работает, перейдем на нашу карту, на которой мы желаем это сделать, и там создадим специальный ивент.
Этот волшебный ивент будет работать у нас как источник света, я назвала его «текущая освещенность». Мой способ смены дня и ночи предполагает, что на всех картах, на которых происходит смена дня и ночи, должен стоять такой вот подобный ивент из этого семейства. Конечно, ставим его невидимым, под героем, параллельно. Внутри проверяем значения переменной с помощью ветвления. Если у нас значение переменной равно 0, то это утро – ставим освещенность яркую, Иначе - если 1, то день – нейтральная освещенность, Иначе, если 2, то вечер – начинает темнеть, Иначе, если 3, то ночь, ставим, чтобы было темно, как ночью.
Этот способ удобен тем, что на разных картах освещенность в зависимости от смены дня и ночи может быть разная. А неудобен тем, что везде нужно проставлять этот ивент, который задаёт освещенность.
Реакция на время суток.
Теперь займемся жителями деревни, которая расположена на нашей карте. Смена дня и ночи не будет выглядеть такой реалистичной, если населяющие игровой мир существа не будут обращать на это никакого внимания. Так что давайте я покажу, как я делаю разную реакцию на смену дня и ночи.
Рассмотрю самый простейший вариант, девушку, которая круглые сутки находится на одном месте.
Как видете, у неё 4 вкладки, на каждой из них написано, чему равно значение переменной смены дня и ночи, и в зависимости от этого она произносит разные фразы. В приложенной демке я добавила еще несколько человек, некоторые из них появляются только в определенное время суток, то есть определенные вкладки у них отсутствуют.
Какая же смена дня и ночи без гостиницы, в которой можно поспать? Вообще то, оно и так уже выглядит более менее похоже, но мы пойдем дальше, и сделаем гостиницу, в которой можно будет отдыхать только ночью, и просыпаться утром.
Здесь мы сначала проверяем, равна ли наша переменная трём, то есть, наступила ли ночь. Если ночь наступила, то предлагаем ночлег, иначе предлагаем зайти попозже. В случае с ночлегом мы не забываем переключать переменную на значение 0 – утро. Иначе получится, что мы не спали.
Также в демке я добавила специальный куст, который по команде игрока может изменить время суток.
Запуск.
Теперь мы можем запустить проект и увидеть это всё в действии! Чего-то, сутки меняются слишком быстро, не так ли? Не проблема, сейчас мы это объясним!
Вот, теперь порядочек, всё логично, всё работает!
Демка прилагается! Скачать
Если вам нравится - можете не стесняться и брать мои наработки для своих каких-нибудь проектов на RPG-мейкере. Рада, если мой опыт окажется вам полезным.
Напоследок ложка дёгтя: перед тем, как вставлять в игру такую систему как смена дня и ночи, хорошенько подумайте - а надо ли оно? Дело в том, что в определенных случаях эта "фишка" совсем не оправдана и может даже изрядно испортить игру. Не верите? А вот в "Дряньке" были неоднократные случаи, когда люди жаловались на то, что надоело, как везде темно, а ночью магазины закрыты, ничего не купить, а гостиницу не найти... Так что думайте сами, решайте сами. А как это делать, теперь вы знаете!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Однако, если в опции "Цвет экрана" сделать время перехода не 30, а, скажем, 100 десятых секунды, то переход получится более плавным и правдоподобным.
Иначе создаётся впечатление, что не солнышко зашло, а лампочка погасла (слишком резкий переход)
Естественно, автор об этом знает, это я для других написал, кто, может быть, ещё не догадался (для них же замечу, что этот туториал подходит не только для смены дня и ночи, но и, скажем, для изменения погоды).
Но мне, думаю, равно как и многим другим, мозолит глаза другая неприятность.
Я говорю про резкое исчезновение неписей (NPC).
Сам процесс смены времени суток отлично сбалансирован, на мой взгляд, это оптимальный вариант. Но такая, не побоюсь сказать, телепортация неписей как по мановению волшебной палочки несколько портит всё впечатление.
Я уже сам долго ломаю голову над тем, как заставить неписей идти к определённой точке.
Если нпс стоит весь день на одном месте, а вечером отправляется домой, то никаких проблем не возникает.
Для этого мы просто прописываем ему маршрут до дома.
Но если он весь день напролёт болтается по городу, а потом приходит время возвращаться в хату, то маршрут в данном случае не поможет.
Эх, почему они не сделали кроме команд "Идти к герою" команду "Идти к событию №..."
Всё было бы так просто.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ты прямо сказал то, о чем я забыла добавить, а потом уже только вспомнила!
Мда, имеет место быть такой недостаток..ну что ж поделаешь. Я вот пока и не знаю, как сделать по-другому, чтобы плавненько было...Но такая, не побоюсь сказать, телепортация неписей как по мановению волшебной палочки несколько портит всё впечатление.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Насчёт плавненько. Был бы это XP/VX — можно было б, скажем, вечером, заставлять NPC бежать домой, а как добегут — переключать у них личные свитчи, а утром обратно возвращать. Вообще, со скриптом дискретного времени можно было б целые расписания задвигать. Но вот с 2000/2003-м... Куча свитчей понадобится.
Надо ещё подумать, может другие варианты есть...
edit: Кстати, ссылка на демку почему-то не работает.
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Герберт Уэст, да, кстати, соглашусь с тобой - при хорошей фантазии этот туториал можно использовать и для создания других переодических вещей, к примеру, погода, а если идти дальше - смена времён года даже, только тайлсеты нужно будет менять, а не освещение.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Придётся каждому прописывать маршрут до дома, так ещё и не в одном экземпляре.
Хотя...если попробовать совместить все способы, то может быть это и облегчит задачу.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
В общем, система нормальная, немного подкорректировать и всё становится просто замечательно...если не считать пропадающих неписей, но о них разговор отдельный.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
При таком готическом раскладе, надо сделать возможность спать, как в готике: до полудня, до утра, до полуночи.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Вот именно!!! Тем более, что это совсем несложно сделать. А то, что магазины ночью не работают,так это тоже не беда, на то есть фантазия и смекалка автора.Злодей пишет: При таком готическом раскладе, надо сделать возможность спать, как в готике: до полудня, до утра, до полуночи.
Магазины закрываются, а в подворотне появляется барыга и продаёт всё, что тебе нужно. Просто и практично.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Проще уж пускай нпц исчезают при выходе из локации. Во время перемещения между картами.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Задача следующая: некоторый NPC стоит в некотором месте, заранее неизвестном, т.е. обычный рандомно бродячий. Требуется в определённый момент времени заставить его прибежать в заранее ИЗВЕСТНУЮ точку, скажем, его дом. На пути у него могут быть как статичные препятствия в виде окружения, так и динамические, в виде идущей толпы и/или самого ГГ. Найденный путь необязательно должен быть оптимальным, но всегда конечным, т.е. он не должен где-то подвиснуть не зная как пройти.
Целевой мэйкер: 2000/2003, т.к. для XP/VX решение мне известно.
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Это он типа куриц и кошек будет, которые под ногами у ГГ могут ходить? Не, так не пойдёт. Ну накрайняк в маршруте можно включить полную проходимость ивенту, но результат тоже будет некошерный — с бегущим сквозь стены NPC.всётаки зная пару особенностей рм2к3, замечу, что было бы логично выбрать правильный уровень для этого объекта - скажем ниже игрока, а все остальные объекты, которые так или иначе могут помешать движению расположить на уровне игрока или выше.
edit: Тьху, долбанная подсветка синтаксиса! Ну почему нельзя моноширинный шрифт в неё поставить?
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Только вот её бы в Энциклопедию - зря она что ли создана была?
На форуме её легко потеряют, в энциклопедии - куда позже.
Аннтенна, перенесёшь? Или мне перенести?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Это ты самокритично.но кто то не тем местом читал видимо или даже не старался применить прочитанное к мозгу...
Нафиг мне твой код сдалсяесли ты не в состоянии сам код написать то я за тебя его писать не буду.
Ты сказал, что сделать из любой точки маршрут легко. Но, то что ты предлагаешь — это полная, извиняюсь, херня.
Если в моём примере сверху NPC поставить одно препятствие, он по твоему алгоритму никогда не выйдет.
идти вверх, пока значение у больше 0 и х больше 3
если у = 0 идти влево пока х больше 3
если х =< 3 идти вниз пока у меньше 4
если у=4 и 1<х=идти влево
если у=4 и х=1 идти вверх
если уи х=1 исчезнуть в двери.
Так скажи — "сморозил херню, как сделать не знаю".
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
в инструменте "двигать событие" можно поставить условие "игнорировать препятствие", при этом обычно нпс начинает обходить все препятсятвия, которые ему встречаются. Если его поставить, то, быть может, вышеизложенный алгоритм сработает.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Соль её не в том, что ивент начинает обходить препятствие, а в том, что если какой-то из пунктов маршрута выполнить нельзя, то просто выполняется следующее действие маршрута. При отключенной галке, соответственно, выполнение команды остановится, пока препятствие не исчезнет.
У Злодея, например, с этим был связан жесточайший баг в его ООР3 с полным зависанием игры.
Здесь эта фишка не сработает, потому что она только для маршрута, а у нас тут условия в основном, а команда "Двигать событие" выполняется только для одного шага (в выбранном направлении). Следовательно, что будет ивент ждать, что не будет — стена с места не сойдёт.
Или сработает, но нужно какое-то другое её применение... :dry:
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
→ → ↓ ↑ Y
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Эй, Cherryyy? Куда он пропал? Надо ему намекнуть, чтобы занялся этой проблемкой.
ЗЫ. Кстати, ты личку смотрел? Я тебе там кое-что скинул.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Теоретически я понял, что ты имеешь в виду. Идея, признаться, впечатлила, если не вдаваться в подробности.
Но, вот, практически я себе пока что плохо представляю, как это сделать, но это, опять же, по причине своей собственной неопытности в подобных вопросах, я этого не отрицаю.
Псевдофилософ
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
идти влево
и х=1 исчезнуть в двери.