Урок по ConditionSwitch (ConditionSwitch tutorial)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Итак, я немного изучил функциональные возможности ConditionSwitch в Ren'Py и, после некоторых обсуждений на форумах Ren'Py, решил написать этот небольшой урок. Это действительно довольно простой функционал, но есть несколько подводных камней и я надеюсь, что это поможет кому-то в какой-то момент.


Ресурсы
Проект Ren'Py и файл скрипта прилагаются к этой теме. Скачайте любой из файлов и просмотрите его, там есть рабочий код, который вы можете расширить.
Сссылка на архив проекта:
  • ConditionSwitchDemo.rar - Проект Renpy с ConditionSwitch разработан, чтобы вы могли поиграть с ним.
  • script.rpy - Файл script.rpy, если вы предпочитаете просто скопировать и вставить эего в существующий проект или что-то подобное.


Что такое ConditionSwitch?
На это лучше всего ответить примером. Предположим, я добавляю какую-то боевую систему в свою игру, будь то стандартная ролевая игра в стиле RPG или что-то более реалистичное. В любом случае, легко представить, что я хочу, чтобы изображение врага или персонажа игрока менялись при получении урона. Сначала он был бы здоров, но чем больше повреждений он получает, тем хуже должна была выглядеть картина.


Джон
В этом примере мы назовем нашу несчастную цель Джоном. У него будет три картины. Извиняюсь за дерьмовое качество фотографий, но мне нужно было что-то быстро использовать в проекте. Они немного большие, но я думаю, , что общая идея подходит.
Рисунок 1 - нет повреждений - более 50% очков жизни.
У Джона всё хорошо. Он совсем не ранен. Это всего лишь поверхностная рана. Вернись, трус! Я все еще могу укусить!
Рисунок 2 - больно - от 50% до 10% очков жизни.
Джон ранен. Он не очень хорошо себя чувствует и он может использовать зелье или что-то подобное.
Рисунок 3 - очень больно - Менее 10% очков жизни.
Джон при смерти. Бедный Джон.


"Неправильный" способ сделать это
Как видите, в этом примере мы даем Джону очки жизни. Для этого мы определяем переменную: current_hp. В начале боя она устанавливается следующим образом:
$ current_hp = 100
(Да, мы могли бы работать и с maximum_hp, но для простоты мы используем только это).
Теперь у Джона есть два способа показать другую картину, когда ему становится больнее. С или без ConditionSwitch. Чтобы проиллюстрировать разницу, давайте сначала рассмотрим «неправильный» путь: без ConditionSwitch. Вы бы написали что-то вроде следующего кода в Ren'Py.
image john = john.png
image john hurt = john_hurt.png
image john_very_hurt = john_very_hurt.png
Затем во время боя вам нужно будет проверять урон в конце каждого шага, чтобы увидеть, должна ли картина измениться:
if (current_hp < 10):
                show john_very_hurt
elif (current_hp < 50):
                show john_hurt
Или что-то в этом роде.


Способ с ConditionSwitch
Всё вышеперечисленное работает вместе... в теории. Тем не менее, это означает, что мы должны всякий раз запускать проверку для очков жизни Джона, когда он получает урон. Кроме того, если у вас есть несколько изображений того, как Джон получает больше урона, один на 80%, один на 60%, один на 40% и так далее, то это становится немного сложнее. Гораздо элегантнее использовать в Ren'Py функцию ConditionSwitch. Это не избавляет от необходимости проверять, выполняются ли определенные условия, но это возьмёт работу по переключению на себя. Как это работает? Вики-страница находится здесь.
И предлагает нам следующий пример:
image bg waterfront = ConditionSwitch(
        "time_of_day == 'day'", "waterfront_day.jpg",
        "time_of_day == 'night'", "waterfront_night.jpg",
        )
Вы видите, что он форматируется в разных строках. Каждая строка представляет собой уникальную комбинацию условия (первый аргумент между кавычками) и изображение, которое должно быть показано, если условие истинно (второй аргумент между кавычками). Пока на экране отображается изображение, Ren'Py оценит, верно ли первое условие. Если это так, он покажет изображение в сочетании с условием. Если не так, он перейдет ко второму условию и проверит его и т.д., т.д.
Возьмем пример Джона и его постоянная борьба. На самом деле, я беспокоюсь о Джоне. Мы собираемся добавить в общей сложности три разных строки к ConditionSwitch Джона.
Строка 1
current_hp < 10, john_very_hurt.png
Отобразит Джона, когда у него меньше 10% здоровья.
Строка 2
current_hp/max_hp<0.5, john_ hurt.png
Отобразит Джона, когда у него от 10% до 50% здоровья.
Строка 3
"True", john.png
Поначалу это выглядит немного странно. Однако нам это нужно, чтобы, если первая и вторая строки не были истинными, функциональность ConditionSwitch могла возвращаться к этой строке, которая, поскольку мы описали условие как «True», всегда верна. Поэтому, если строки 1 и 2 неверны, Джон всегда будет отображаться в качестве основного изображения John.png. Вы должны добавить окончательное условие "True", чтобы ConditionSwitch знал, какое изображение показывать по умолчанию. Если вы этого не сделаете, вы получите следующую ошибку:
While running game code:
  File "game\script.rpy", line 26, in script
Exception: Switch could not choose a displayable.
Вышеприведенные строки дают нам:
image john = ConditionSwitch (
    "current_hp < 10","john_very_hurt.png",
    "current_hp < 50","john_hurt.png",
    "True", "john.png"
    )
Ну вот и всё, проще не бывает. Вы можете сделать свои условия более длинными и сложными, но основная предпосылка остается прежней. Проверьте скрипт Ren'Py или проект, прикрепленных к посту, если вы хотите поиграть с кодом. Не стесняйтесь задавать мне вопросы!


Устранение неполадок – запятые после имён изображений
Постарайтесь не забывать ставить запятые в конце строк (те, что после объявления имён изображений)! Это легко забыть, и тогда ваш код не будет работать. Данный код...
image john = ConditionSwitch (
    "current_hp < 10","john_very_hurt.png"   <--- БЕЗ ЗАПЯТОЙ
    "current_hp < 50","john_hurt.png"     <--- БЕЗ ЗАПЯТОЙ
    "True", "john.png"
    )
... Выдаст вам такие ошибки:
While running game code:
  File "game\script.rpy", line 26, in script
NameError: name 'john_hurt' is not defined


Устранение неполадок – порядок условий
Как уже говорилось, порядок важен. Если вы поместите строки в другом порядке, например...
image john = ConditionSwitch (
    "current_hp < 50","john_hurt.png",
    "current_hp < 10","john_very_hurt.png",
    "True", "john.png"
    )
... Вы никогда не покажете 'john_very_hurt.png'. Проверки идут вверх-вниз. В этом порядке, поскольку значение 'current_hp < 50' является истинным для 45 и 5 очков жизни, ваш 'current_hp < 10' никогда не будет проверен и связанное изображение никогда не будет показано.

Источник[править | править код]

Статья "ConditionSwitch tutorial" на английском языке.


На главную страницу Книга рецептов Энциклопедии Ren'Py Форумы Lemma Soft Вернуться к началу статьи