Найти в Дзене
RPG Maker World

RPG Maker MZ: урок №9. Ветвление условий и Завершить выполнение

Вообще-то в этом уроке у меня были запланированы переключатели, но, приступив к написанию, я понял, что катастрофически не хватает возможностей, чтобы объяснить тему на живом примере. Поэтому сегодня у нас Его Величество Ветвление Условий! Для тех, кому интереснее смотреть, чем читать, запилено соответствующее видео: Итак, команда «Ветвление условий» находится в поле «Управление процессом». В программировании его действие известно по базовому циклу If…Else…, что на человеческом языке выглядит как Если…То… Если условие выполнено, То происходит следующее Условием может быть целая куча различных данных и событий – если переменная равна чему-то, больше чего-то, меньше, больше или равна, меньше или равна, не равна. Если персонаж в партии, если есть предмет в инвентаре, если у персонажа нужный класс, если есть какое-то количество денег и так далее. Потыкайтесь по страницам в окне команды – вы убедитесь, сколько возможностей оно предоставляет. Давайте уже заюзаем эту конструкцию на практике.

Вообще-то в этом уроке у меня были запланированы переключатели, но, приступив к написанию, я понял, что катастрофически не хватает возможностей, чтобы объяснить тему на живом примере. Поэтому сегодня у нас Его Величество Ветвление Условий!

Для тех, кому интереснее смотреть, чем читать, запилено соответствующее видео:

Итак, команда «Ветвление условий» находится в поле «Управление процессом».

В программировании его действие известно по базовому циклу If…Else…, что на человеческом языке выглядит как Если…То…

Если условие выполнено, То происходит следующее

Условием может быть целая куча различных данных и событий – если переменная равна чему-то, больше чего-то, меньше, больше или равна, меньше или равна, не равна. Если персонаж в партии, если есть предмет в инвентаре, если у персонажа нужный класс, если есть какое-то количество денег и так далее. Потыкайтесь по страницам в окне команды – вы убедитесь, сколько возможностей оно предоставляет.

Давайте уже заюзаем эту конструкцию на практике. Вернемся к нашему недоквесту из прошлого урока. Он в действительности никаким квестом и не является вовсе, так как мы не поставили никаких условий его выполнения, а просто НПС говорили, сколько грибов собрал Игрок.

-2

Давайте изменим код у НПС, что бы они действительно давали подобие квеста.

Из данных у нас имеются уже задействованные переменные, поэтому на них и будем опираться.

Открываем Любителя опят и выше команды сообщения задаем команду ветвления (напомню, что команда выше ставится двойным ЛКМ по текущей):

-3

В качестве условия выбираем равенство переменной «Опята» нулю. Почему нулю? Так мы сможем задать начальный диалог, в котором НПС будет просить игрока собрать опят.

Обратите внимание на галочку «Иначе» внизу окна команды. Она создает ветку на случай, если событие не выполнено. Если мы эту галочку не поставим, то игра проверит переменную на равенство и сделает то, что мы скажем только тогда, когда равенство будет истинным. Если же переменная будет хранить в себе число отличное от нуля, то нифига не произойдет, так как без ветки «Иначе» мы не можем задать действие для этого случая.

Жмем окей:

-4

Видите пустую строку после «Если: Опята = 0»? Сюда можно пихать любые команды, одну за одной. Все они будут по очереди выполнены в случае, если переменная «Опята» равно нулю.

То же самое и под строкой «Иначе», но все, что вы напихаете под нее будет выполнено, если переменная равна чему-то другому, но только не нулю.

Переменная равна нулю в том случае, если наш Игрок еще ничего не собрал, поэтому под «Если» мы запихнем сообщение:

-5

А под «Иначе» перенесем уже имеющееся сообщение с выводом количества этих опят. Для этого просто нажмем ПКМ по строке с командой и выберем Вырезать. Затем под «Иначе» еще раз ПКМ и выберем Вставить. Ну, либо ctrl+X и Ctrl+V, если вам так привычнее.

-6
-7

Можно было бы изменить подобным образом и остальных НПС, но мы пойдем дальше и Любитель мухоморов будет требовать не просто собрать ему мухоморов, но и определенное их количество.

Допустим, он хочет три мухомора. Это значит, что нам потребуется реакция в виде сообщений на случай, если переменная равна нулю (мы ничего еще не собрали), если переменная меньше трех (собрали, но мало) и если переменная больше или равна трем (собрали сколько нужно, а то и с запасом).

Три «если», значит три условия. Значит три команды. Но их нельзя просто расположить подряд, так как у нас две имеют схожие условия и будут одинаково справедливы… в каком случае? Кто умный? Правильно – если переменная будет равна нулю. У нас условие на равенство нулю и на меньше трех – ноль тоже меньше трех. Поэтому, если мы просто кинем подряд три команды, то игра пройдется по ним (а мы помним, что все команды обрабатываются движком по очереди) и выполнит две, вместо одной. Технически это не приведет к серьезным последствиям, просто на экран выведется лишнее сообщение. Нам это не надо.

Что делать? Вложить одно ветвление в другое. Создаем ветвление на равенство нулю с веткой «Иначе» и сообщением:

-8

А теперь в «Иначе» задаем еще одно ветвление на случай, если переменная меньше трех, ну и сообщение в него вкладываем тоже:

-9
-10

Если переменная равна нулю – понятно. Если переменная меньше трех – сделали. По логике, надо было бы сделать еще одно ветвление на случай, если переменная больше или равна трем, но… Нам же не строгое число нужно. Все, что не равно нулю и не меньше трех будет отвечать условиям, верно? Поэтому в последней команде я просто создал еще одну ветвь «Иначе» и в нее запихал сообщение с выведением результата из прошлого урока.

Думаете это сложно?) Для первого раза, безусловно, но по факту нужно просто привыкнуть. И не строить длинных вложений – можно в них потом себе шею свернуть. Я сворачивал, я знаю. Два-три максимум. Как же избежать множественных вложений, но и квесты делать? Займемся Любителем Грибов.

У нас есть ивент, который подсчитывает количество собранных грибов и сообщает об этом.

-11

Давайте в этот раз сделаем задание на строго определенное количество, например пять грибов. Если использовать предыдущий метод, то можно крышей поехать – условий уже будет куча:

Если переменная равна нулю
Если переменная меньше пяти
Если переменная больше пяти
Если переменная равна пяти

Эдак заблудиться можно будет в ветвлениях. Ок, используем более умный вариант. Для начала создадим уже привычное двойное вложение на случай, если количество грибов равно нулю и на случай, если оно меньше пяти – опять же ноль тоже меньше пяти, поэтому нам нужно эти моменты учесть:

-12

Заметьте, я задаю команды после действий с переменными, так как нам сперва нужно произвести подсчет, а уже потом использовать результат.

Я не создал ветвь «Иначе» в ветвлении на Все грибы < 5, а почему? Потому, что пришлось бы вкладывать в это «Иначе» ветвление на равенство и на число больше пяти. Это геморрой и говнокод (такое понятие даже в визуальном скриптинге есть, да).

Вместо этого мы просто под этой командой создаем новое ветвление на равенство пяти и ветвь «Иначе» для прочих результатов (ноль – есть, меньше пяти – есть, пять – есть, значит, все прочее точно будет больше пяти, надеюсь, понятна логика?):

-13

Самые внимательные и умные уже видят косяк в этом коде. Можете тоже поискать, если интересно.

Косяк заключается в том, что, как я уже отбил язык и клавиатуру говорить, команды Содержимого выполняются подряд, от начала и до конца. Допустим у нас 4 гриба. Как будет работать выполнение:

проверяем Если = 0 – не сработало
проверяем Иначе если < 5 – сработало, выводим текст
проверяем Если = 5 – не сработало
проверяем Иначе - сработало, выводим текст.

Четыре меньше пяти и не равно пяти. Обе команды будут выполнены. Но нам не надо обе, нам надо одну!

Нам поможет команда «Завершить выполнение». Она находится в поле «Управление процессом» и используется в ветвлениях постоянно. Команда прекращает выполнение команд ивента, как только движок ее увидит.

-14

Куда нам нужно ее поставить? Ну, ясное дело, что не в конец – там и так все прекратится без команды. У нас есть условия, при которых нас не интересуют дальнейшие проверки.

Например, если выяснилось, что у Игрока ноль грибов – какой нам смысл в дальнейших проверках? Мы знаем, что там ноль, всё, достаточно. Или если там не ноль, но меньше пяти – какой смысл продолжать? Раз меньше пяти, то явно не пять и не больше же!

Вот после сообщений в этих двух условиях мы и поставим команду «Завершить выполнение».

-15

Вот таков будет финальный вариант кода этого НПС. Обратите внимание – я не ставил завершение на равенство пяти и все, что Иначе – там оно просто не требуется. Мы по очереди отбрасываем все возможные варианты, и в конце уже не будет двойных выполненных условий – перебрали уже всё, что можно.

Ну, что? Тестируем, что ли?) Извините, но гифки такого объема записывать хлопотно, поэтому просто дам ссылку на конец видео урока с таймкодом:

https://youtu.be/vC0CgEog7ZE?t=1113