Ну, вот мы и дошли до едва ли не главной темы, касающейся разработки игр на мейкере. Тема хоть и не такая обширная, но требует обязательного и полного понимания, так как от умения пользоваться переменными, переключателями и ветвлением условий (которое, по сути, работает с ними в связке) зависит реализация 90% игровых механик и возможностей.
Для тех, кому удобнее смотреть, нежели читать, есть и видео версия:
Что такое переменная?
Как мы знаем из школьного курса информатики и/или любого базового курса программирования, переменная, это адресованная область памяти, которая хранит какие-либо данные, к которым можно обращаться с помощью этого адреса и использовать эти данные в коде программы.
В мукере почти то же самое – есть выделенная ячейка в памяти, в которую можно запихнуть множество различных данных. Она и называется переменной.
Нафига они вообще нужны? Допустим, у вас есть квест на сбор определенного количества предметов, которые нужно принести определенному НПС. Берем переменную и, как только находим предмет, увеличиваем ее значение на 1. Как только значение переменной достигнет нужного значения, квест будет выполнен. Это самый примитивный пример, разумеется в переменные используются для массы других дел, от реализации головоломок, до стелс-систем.
Давайте разберем их возможности вкратце, а заодно потренируемся – сделаем простейший квест на сбор грибов. Представим, что у нас есть три НПС. Один любит опята, другой мухоморы, а третьему подавай что угодно, т.е. любые грибы.
Создадим этих ребяток в виде обычных стоящих на месте ивентов с произвольной графикой. Команд пока никаких задавать не будем.
Далее нам потребуются, собственно, грибы. Начнем с мухоморов. Это тоже будет простой, стоящий на месте ивент, только с графикой мухомора (она есть в Outside_B, главное, что бы этот лист был в наборе выбранного тайлсета для карты)
Приоритет «на одном уровне», триггер по кнопке, все как обычно. Я настоятельно рекомендую на все ивенты, которые не должны двигаться и анимироваться, ставить галочку «фиксированное» в параметрах. Даже если оно и само не в состоянии выдать нам анимацию, как в этом случае, привычка – дело хорошее, если привычка полезная.
Теперь зададим ивенту команду.
Команда для работы с переменными находится на той же странице команд ивента, что и «Показать сообщение», которое мы рассматривали прошлый раз, только чуть ниже – в поле «Внутренние данные», вторая кнопка сверху. Жмем ее и смотрим на открывшееся окно с очередным клондайком функционала:
Здесь три поля –
«Переменная» - отвечает за выбор переменной, содержимое которой мы будем как-либо изменять. Вы же поняли, что переменная, это просто некая область в памяти, ячейка, да?
«Операция» - позволяет выбрать действие, которое мы с упомянутым содержимым будем производить
«Операнд» - здесь выбираем то, что нам нужно использовать для изменений выбранной переменной.
В первом поле у нас два варианта выбора – мы можем работать с одной единственной переменной (вариант «Один»), либо использовать сразу несколько, идущих подряд (вариант «Диапазон»).
У больших пацанов из мира программирования принято перед использованием переменные создавать (они это называют – «объявлять»). Мукеристы от данной необходимости избавлены – движком по умолчанию зарезервировано для нас 5000 (пять тысяч) переменных под ID номерами от 0001 до 5000, соответственно. Нажмем на кнопку выбора справа от поля «Один» и убедимся в этом:
Мы видим лишь 20 пустых ячеек, но на самом деле их 5000, как я и сказал, просто движок прячет от нас остальное, чтобы не загромождать. В левом нижнем углу есть кнопка «Изменить количество», которая работает точно так же, как и аналогичная в тайлсетах базы данных. Здесь можно задать количество переменных и максимальным будет именно пять тысяч.
Забегая вперед, скажу, что 5000 – это очень много, но если вдруг вам этого будет мало (с трудом представляю подобную ситуацию), то существует плагин, расширяющий такие вот базовые ограничения мукера до бесконечности.
Выбрав переменную (одиночный клик ЛКМ по строчке) мы можем ее как-нибудь обозвать, введя имя в поле «Наз…» внизу. Я настоятельно рекомендую давать переменным понятные имена, которые указывают на то, зачем она нужна и что в себе хранит.
Названия переменных не видны игроку и никак не используются мукером, который работает исключительно с их ID номерами, поэтому названия можно задавать на любом языке и в любом формате.
Название, кстати, можно задать для нескольких переменных прямо в этом окне, просто выбирая их по очереди (главное потом – не забыть вернуться к нужной), что мы и сделаем:
Далее у нас выбор операции. Что мы должны сделать со значением данной переменной при нахождении мухомора? Правильно, увеличить на единицу. Т.е. выбираем плюс (+), а в поле «Операнд» задаем Постоянная 1.
Теперь, когда мы подойдем к ивенту «Мухомор» и нажмем кнопку действия, то к текущему значению переменной «Мухоморы» прибавится единица.
Значение ранее не использованной переменной по умолчанию равно нулю. С точки зрения программирования, это не одно и то же, что отсутствие данных. Переменная уже хранит данные и это ноль. Постарайтесь это запомнить.
Поскольку мы пока не умеем делать исчезающие ивенты, то нам надо как-то игроку дать понять, что действие произошло. Давайте после команды переменной зададим вывод сообщения на экран:
Я использовал спец.команду для диалогов \V[n], которая нам сразу выведет значение переменной под номером 1(т.е. переменной «Мухоморы»), рассказав, сколько мы уже собрали.
Теперь на карте копируем ивент с помощью контекстного меню по ПКМ, либо сочетанием клавиш Ctrl+C и вставляем тем же методом, либо Ctrl+V, в другое место.
Первый ивент назовем «Мухомор», а копированный превратим в Опенок.
Для это заменим название ивента, переменную в Содержимом и отредактируем сообщение. Редактирование команд ивента осуществляется путем их выбора кликом, а затем командой из контекстного меню по ПКМ, либо клавишей Пробел.
Не забудем также заменить графику на опята, они лежат слева от мухоморов на листе тайлов вкладки B.
Не забудьте команду \V[1] заменить на \V[2] в выводимом сообщении.
Итак, грибы у нас готовы. Обратимся к НПС и начнем с любителя опят. Он будет у нас пока просто выдавать сообщение с похвалой и количеством собранных опят:
Вызывать окно редактора событий можно кликом по ивенту на карте, либо кликом по списку в левой части. В RPG Maker MV и более ранних список отсутствует и вызов осуществляется только кликом по ивенту на карте.
То же самое, с поправками, делаем в ивенте НПС, который специализируется по мухоморам, и для того, что любит любые грибы вообще.
Давайте запустим проект и проверим, как оно работает!
Как мы видим, мухоморы и грибы собираются без проблем, причем их количество увеличивается к каждым обращением игрока к ивенту.
НПС тоже нам сообщают требуемую информацию, за исключением Любителя грибов, который упрямо считает, что у нас их ноль.
Происходит это потому, что у нас есть переменная для общего количества грибов, но мы никаких действий с ней не произвели и она содержит дефолтный 0.
Как эту ситуацию изменить? Есть два пути, первый – изменить оба ивента с грибами и добавить туда команду прибавлять единицу не только к переменной, отвечающей за количество данных грибов, но и к переменной «Всего грибов». Это самый примитивный вариант, он понятен, поэтому я даже демонстрировать его не буду.
Иногда редактировать кучу ивентов неудобно и проще произвести вычисления уже на месте, у нашего НПС. Добавим в его ивент еще две команды перед сообщением – ведь мы хотим произвести подсчет грибов перед тем, как сообщим их количество.
Все команды в Содержимом ивента выполняются движком последовательно, одна за другой. Чтобы добавить новую команду выше имеющейся, выбираем ту, над которой хотим добавить новую и делаем двойной клик ЛКМ по ней. Либо ПКМ и в контекстном меню выбираем «Новый».
Для начала нам нужно в переменную «Всего грибов» скопировать значение из «Мухоморы».
Мы могли бы сразу прибавить Опята к Мухоморам и получить сумму, но тогда эта сумма будет записана в переменную «Мухоморы», а нам это не нужно, мы хотим эти данные сохранить отдельно, не затерев количество мухоморов!
Нажимаем ОК, а затем добавляем еще одну команду под предыдущей. Здесь мы к значению переменной «Всего грибов» прибавим значение переменной «Опята»:
Должен получиться вот такой код в итоге:
Проверямба!
Все работает. А куда оно, собственно, денется – мы сделали все правильно.
Таким же образом, мы можем производить действия вычитания, умножения и деления с самыми разными данными – случайными числами, количеством предметов в инвентаре, координатами, валютой, показателями НР и МР и т.д. Переменная может хранить очень много всего – достаточно посмотреть на пункты в окне работы с ней.
Тупо перечислять все это многообразие я не вижу большого смысла – нужно все закреплять на практике, а такая обширная практика уже является темой для расширенного курса, так как для работы потребуются все базовые знания.
Единственное, что вы должны высечь себе на подкорке раз и навсегда – стандартные переменные движка умеют хранить только целые числа. Дробная часть всегда отсекается на стадии записи результата в переменную.
Т.е. к примеру, если вы разделите 6 на 4, то в переменную запишется 1, а не 1,5. И выдавать по запросу она будет именно единицу. Это нужно всегда помнить и учитывать.
Ну, надеюсь, что этот урок не был излишне перегружен информацией и она нормально усвоилась вашими головами, а то я уже одну версию этого урока удалил, поняв, что это справочник какой-то получается)
Возможно я пропаду на пару-тройку дней, но не переживайте, это жизнь, в ней не всегда находится 4-5 свободных часов.
До новых встреч!