Анатолий Адонин

Анатолий Адонин 

Разработка на Python / Renpy

372subscribers

84posts

Showcase

16

31 Синтаксис экранов в Renpy (Перевод, модальность, notify)

В предыдущем уроке мы узнали о базовых элементах экранов, с помощью которых можно выводить текст и изображения. Теперь познакомимся с другими часто используемыми элементами, которые могут превратить визуальную новеллу в полноценную игру.
Конструкция нижнего подчёркивания и скобочек _() используется для пометки текста, что он должен быть переведён. По умолчанию в движке есть инструмент генерации файлов для перевода игры на другие языки. Однако его проблема в том, что он автоматически берёт весь текст только из лейблов. Если текст у нас написан в screen движок его не добавит в файлы перевода.
Чтобы текст внутри экранов также попадал в файлы перевода его помещают в скобочки с нижним подчёркиванием _("Любой текст").
Обратите внимание, что ранее при создании персонажей мы также использовали эту конструкцию по той же причине - чтобы в последствии имена героев можно было перевести на другие языки.
Заведите себе привычку всегда при написании текста в экранах сразу обрамлять его скобками и подчёркиванием. Чтобы при переводе игры вам не приходилось заново проходиться по всем файлам и проставлять скобки во всех экранах.
***
Модальность экрана - это параметр, который позволяет блокировать слои под экраном. Например, у того экрана, что мы создали ранее, этот параметр отключён. Т.е. после вызова экрана мы дальше можем кликать диалоги, а текст и изображения в screen interface просто будут висеть на экране как интерфейс.
Если прописать параметр modal True у экрана, то он заблокирует собой другие слои. В результате диалог и прочие элементы будут некликабельны. Модальность обычно используется в экранах инвентаря, журналах заданий, и подобных скринах, чтобы при взаимодействии с ними диалоговое окно не двигалось дальше.
Также это можно использовать для отображения на экране какой-то информации. И чтобы игрок случайно её не прокликал, заблокировать диалоги на некоторое время.
В коде это выглядит так:
Т.е. открыв экран мы заблокировали вывод диалогов, чтобы показать оповещение. При клики по экрану ничего не происходит. Таким образом игрок не сможет случайно прокликать то, что вы хотите, чтобы он точно увидел.
Обратите внимание, что заблокировав экран игра может остановится намертво, так как игрок ничего не сможет сделать. Поэтому мы прописываем таймер, который сам закроет экран и разблокирует возможность дальше кликать диалоги. Вместе с закрытием экрана перестаёт работать и его модальность.
Также внутри лейбла после вызова экрана мы ставим паузу на такое же время, чтобы не отображался первый диалог сценария.
Если у нас в игре много глав, то придётся написать очень много однотипных экранов, в которых будет меняться только текст (Глава 1, Глава 2, Глава 99). Это не очень удобно и время затратно. Поэтому можно написать один универсальный экран, в который мы будем передавать текст и время отображения экрана (время таймера).
В примере выше в скобках, рядом с названием экрана мы прописали два параметра. Это по сути переменные, которые временно хранят значение, которые мы передадим в экран. Для понимания они называются message (сообщение) и time (время), но как и другие переменные вы можете называть их по-своему.
Теперь в строке text будет отобраться текст, который храниться в переменной message. А таймер будет отсчитывать время, которое храниться в переменной time.
Далее каждый раз когда мы вызываем в лейбе экран, в скобках мы передаём экрану текст и время, которые временно сохранится в переменных и будут использованы во время работы экрана.
В примере в разных местах игры мы вызываем один и тот же экран, передавая ему разные параметры, которые будут использованы в момент вызова экрана.
Обратите внимание, что вместо show screen мы использовали команду call screen - в таком виде мы перешли непосредственно к экрану, поэтому устанавливать паузу после его вызова нет необходимости. Однако в таймере после закрытия экрана мы добавили команду Return(), которая вернёт нас к месту после вызова экрана.
Таким образом с помощью одного экрана мы можем выводить множество разных сообщений. Это может быть не только объявление главы, но и другой текст. Например, "Несколько лет спустя" или "В парке, в то же самое время".
Кроме того, можно создать похожий экран и оформить его по-другому, чтобы он выводил сообщения другого плана.
В коде это выглядит так:
Мы создали новый экран в котором отображается фрейм с текстом и таймер. Здесь мы не писали команду modal True, поэтому модальность отключена и экран не блокирует клики. Сообщение всплывает фоном, не мешая игроку взаимодействовать с игрой. В лейбле мы просто показываем экран без паузы.
К слову, в движке есть встроенная функция notify, которая работает аналогичным образом. Она прописывается внутри лейблов $ renpy.notify(_("Сообщение")) и отображается в верхнем левом углу. Её также можно использовать для вывода каких-либо сообщений.
У текста в экранах мы прописывали параметры, которые и так понятны для чего нужны (позиция, цвет, размер). Но, в следующем уроке мы разберём их подробней.

***
Код из урока:
rpy
screen_example.rpy1.74 Kb
Предыдущий урок:
30 Экраны screen в Renpy
Следующий урок:
32 Стилизация текста в экранах screen
Все уроки здесь
Subscription levels3

Личный состав

$1.05 per month
Участник экспедиции

Колонист

$2.8 per month
С комфортом до Бетельгейзе

Штурман

$5.6 per month
Штурмуем геймдев - Пошаговые уроки с нуля до профи
Учимся создавать игры на Renpy
Программируем на Python
Go up