Специальные имена экрана (Special Screen Names)

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

В Ren'Py есть два вида специальных имён экрана:

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


В данном разделе мы приведём примеры экранов. Важно понимать, что, хотя некоторые экраны должны иметь минимальную функциональность, система экранов позволяет добавлять дополнительные функциональные возможности к экранам. Например, хотя стандартный экран say отображает только текст, система экранов позволяет легко добавлять такие функции, как пропуск, режим автоматической перемотки вперед или отключение звука.

Некоторые специальные экраны принимают параметры. Эти параметры могут быть доступны как переменные в области действия экрана.

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

Внутриигровые экраны (In-Game Screens)[править | править код]

Эти экраны автоматически отображаются при выполнении определенных операторов в Ren'Py.

◇ Экран say[править | править код]

Экран say вызывается оператором say при отображении диалога в ADV-режиме. Отображается со следующими параметрами:

who
Текст имени говорящего персонажа.
what
Диалог, произносимый говорящим персонажем.


Ожидается, что он объявит отображаемые объекты со следующими идентификаторами:

"who"
Отображаемый текст, отображающий имя говорящего персонажа. Объекту персонажа могут быть заданы аргументы, которые стилизуют это отображение.
"what"
Отображаемый текст, отображающий диалог, который произносит говорящий персонаж. Объекту персонажа могут быть заданы аргументы, которые стилизуют это отображение. Отображаемый объект с этим идентификатором должен быть определен, так как Ren'Py использует его для расчета времени автоматической перемотки вперед, нажатия для продолжения и других вещей.
"window"
Окно или фрейм. Обычно содержит текст who и what. Объекту персонажа могут быть заданы аргументы, которые стилизуют это отображение.


screen say(who, what):

    window id "window":
        has vbox

        if who:
            text who id "who"

        text what id "what"


◇ Экран choice[править | править код]

Экран choice используется для отображения внутриигровых выборов, созданных с помощью оператора menu. Ему задаётся следующий параметр:

items
Список объектов элементов меню, представляющих каждый из вариантов в меню. Каждый из объектов имеет следующие поля:
caption
Строка с заголовком выбора пункта меню.
action
Действие, которое должно быть вызвано при выборе пункта меню. Это может быть значение None, заголовок меню и config.narrator_menu принимают значение False.
chosen
Принимает значение True, если этот выбор был выбран хотя бы один раз в любом прохождении игры.
args
Кортеж, содержащий любые позиционные аргументы, переданные в меню выбора.
kwargs
Словарь, содержащий все именованные аргументы, переданные в меню выбора.


Кроме того, любые аргументы, передаваемые оператору menu, передаются во время вызова на экран.

screen choice(items):

    window:
        style "menu_window"

        vbox:
            style "menu"

            for i in items:

                if i.action:

                    button:
                        action i.action
                        style "menu_choice_button"

                        text i.caption style "menu_choice"

                else:
                    text i.caption style "menu_caption"


◇ Экран input[править | править код]

Экран input используется для отображения renpy.input(). Задаётся один параметр:

prompt
Текст подсказки, предоставленной для renpy.input.


Ожидается, что он объявит отображаемый объект со следующим идентификатором:

"input"
Отображаемый ввод, наличие которого необходимо. Задаётся всем параметрам, переданным в renpy.input, поэтому он должен существовать.


screen input(prompt):

    window:
        has vbox

        text prompt
        input id "input"


◇ Экран nvl[править | править код]

Экран nvl используется для отображения диалога в NVL-режиме. Ему задаётся следующий параметр:

dialogue
Список объектов ввода NVL, каждый из которых соответствует отображаемой строке диалога. Каждая запись имеет следующие поля:
current
Принимает значение True, если это текущая строка диалога. Текущая строка диалога должна иметь свой текст what, отображаемый с идентификатором "what".
who
Имя говорящего персонажа или значение None, если ни у кого нет такого имени.
what
Произносимый текст.
who_id, what_id, window_id
Предпочтительные идентификаторы для диктора, диалога и окна, связанных с записью.
who_args, what_args, window_args
Свойства, связанные с диктором, диалогом и окном. Они автоматически применяются, если идентификатор установлен как указано выше, но также доступны отдельно.
multiple
Если диалог состоит из нескольких диалоговых окон, то это двухкомпонентный кортеж. Первый компонент – единичный номер блока диалога, а второй – общее количество блоков диалога в операторе multiple.
items
Это тот же список элементов, который будет представлен на экране choice. Если он пуст, меню не должно отображаться.

Когда items отсутствуют, ожидается, что экран NVL всегда будет давать текстовому виджету идентификатор "what". Ren'Py использует его для расчета времени автоматической перемотки вперед, нажатия для продолжения и других вещей. Выполняется автоматически, если по умолчанию используется what_id.

Ren'Py также поддерживает экран nvl_choice, который принимает те же параметры, что и nvl, и используется вместо nvl, когда пользователю предоставляется выбор в игре, если он существует.


screen nvl(dialogue, items=None):

    window:
        style "nvl_window"

        has vbox:
            style "nvl_vbox"

        # Отображает диалог.
        for d in dialogue:
            window:
                id d.window_id

                has hbox:
                    spacing 10

                if d.who is not None:
                    text d.who id d.who_id

                text d.what id d.what_id

        # Отображает меню, если оно задано.
        if items:

            vbox:
                id "menu"

                for i in items:

                    if action:

                        button:
                            style "nvl_menu_choice_button"
                            action i.action

                            text i.caption style "nvl_menu_choice"

                    else:

                        text i.caption style "nvl_dialogue"


◇ Экран notify[править | править код]

Экран notify используется renpy.notify() для отображения уведомлений пользователю. Обычно он используется в сочетании с преобразованием для обработки всей задачи уведомления. Ему задан один параметр:

message
Сообщение для отображения.


Экран notify по умолчанию и связанное с ним преобразование:

screen notify(message):
    zorder 100

    text message at _notify_transform

    # Позволяет контролировать, сколько времени занимает период, когда экран впервые показывается, 
    # и когда он начинает скрываться.
    timer 3.25 action Hide('notify')

transform _notify_transform:
    # Контролируют положение.
    xalign .02 yalign .015

    # Управляют действиями по отображению и скрытию.
    on show:
        alpha 0
        linear .25 alpha 1.0
    on hide:
        linear .5 alpha 0.0


◇ Экран skip_indicator[править | править код]

При наличии в коде экрана skip_indicator, он отображается, когда пропуск выполняется, и скрывается, когда пропуск заканчивается. Экран не принимает никаких параметров.

Вот пример очень простого экрана skip_indicator:

screen skip_indicator():

    zorder 100

    text _("Пропуск")


◇ Экран ctc (Нажать для продолжения)[править | править код]

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

arg
Отображаемый ctc выбирается Character(). Это один из аргументов ctc, ctc_pause или ctc_timedpause для Character, в зависимости от ситуации. Если Character не присвоено значение ctc, то этот аргумент вообще не передаётся.

Кроме того, есть несколько параметров, которые передаются только в том случае, если они требуются экрану.

ctc_kind
Тип ctc для отображения. Один из "last" (для последнего ctc в строке), "pause" или "timedpause".
ctc_last
Аргумент ctc для Character().
ctc_pause
Аргумент ctc_pause для Character().
ctc_timedpause
Аргумент ctc_timedpause для Character().


Вот пример очень простого экрана ctc:

screen ctc():

    zorder 100

    text _("Нажать для продолжения"):
        size 12
        xalign 0.98
        yalign 0.98

Экраны внеигрового меню (Out-Of-Game Menu Screens)[править | править код]

Это экраны меню. Экраны main_menu и yesno_prompt вызываются косвенно. Когда пользователь вызывает игровое меню, отображается экран с именем _game_menu_screen (по умолчанию это экран save).

Помните, что экраны меню можно комбинировать и изменять довольно свободно.


◇ Экран main_menu[править | править код]

Экран main_menu – первый экран, который отображается в начале игры.

screen main_menu():

    # Гарантирует, что любой другой экран меню будет заменён.
    tag menu

    # Фон главного меню.
    window:
        style "mm_root"

    # Кнопки главного меню.
    frame:
        style_prefix "mm"
        xalign .98
        yalign .98

        has vbox

        textbutton _("Начать игру") action Start()
        textbutton _("Загрузка") action ShowMenu("load")
        textbutton _("Настройки") action ShowMenu("preferences")
        textbutton _("Помощь") action Help()
        textbutton _("Выход") action Quit(confirm=False)

style mm_button:
    size_group "mm"


◇ Экран navigation[править | править код]

Экран navigation не является особенным для Ren'Py. Но по договоренности мы помещаем навигацию по меню игры на экран с именем navigation, а затем используем этот экран из экранов сохранения, загрузки и настроек.

screen navigation():

    # Фон игрового меню.
    window:
        style "gm_root"

    # Различные кнопки.
    frame:
        style_prefix "gm_nav"
        xalign .98
        yalign .98

        has vbox

        textbutton _("Вернуться") action Return()
        textbutton _("Настройки") action ShowMenu("preferences")
        textbutton _("Сохранить игру") action ShowMenu("save")
        textbutton _("Загрузка") action ShowMenu("load")
        textbutton _("Главное меню") action MainMenu()
        textbutton _("Помощь") action Help()
        textbutton _("Выход") action Quit()

style gm_nav_button:
    size_group "gm_nav"


◇ Экран save[править | править код]

Экран save используется для выбора файла, в котором будет сохранена игра.

screen save():

    # Гарантирует, что любой другой экран меню будет заменён.
    tag menu

    use navigation

    frame:
        has vbox

        # Кнопки в верхней части позволяют игроку 
        # выбрать страницу с файлами.
        hbox:
            textbutton _("Предыдущий") action FilePagePrevious()
            textbutton _("Авто") action FilePage("auto")

            for i in range(1, 9):
                textbutton str(i) action FilePage(i)

            textbutton _("Следующий") action FilePageNext()

        # Отображение сетки из множества файлов.
        grid 2 5:
            transpose True
            xfill True

            # Отобразит десять слотов для файлов, пронумерованных от 1 до 10.
            for i in range(1, 11):

                # Каждый слот файла является кнопкой.
                button:
                    action FileAction(i)
                    xfill True
                    style "large_button"

                    has hbox

                    # Добавит скриншот и описание к кнопке. 
                    add FileScreenshot(i)
                    text ( " %2d. " % i
                           + FileTime(i, empty=_("Empty Slot."))
                           + "\n"
                           + FileSaveName(i)) style "large_button_text"


◇ Экран load[править | править код]

Экран load используется для выбора файла, из которого будет загружена игра.

screen load():

    # Гарантирует, что любой другой экран меню будет заменён.
    tag menu

    use navigation

    frame:
        has vbox

        # Кнопки в верхней части позволяют игроку 
        # выбрать страницу с файлами.
        hbox:
            textbutton _("Предыдущий") action FilePagePrevious()
            textbutton _("Авто") action FilePage("auto")

            for i in range(1, 9):
                textbutton str(i) action FilePage(i)

            textbutton _("Следующий") action FilePageNext()

        # Отображение сетки из множества файлов.
        grid 2 5:
            transpose True
            xfill True

            # Отобразит десять слотов для файлов, пронумерованных от 1 до 10.
            for i in range(1, 11):

                # Каждый слот файла является кнопкой.
                button:
                    action FileAction(i)
                    xfill True
                    style "large_button"

                    has hbox

                    # Добавит скриншот и описание к кнопке.
                    add FileScreenshot(i)
                    text ( " %2d. " % i
                           + FileTime(i, empty=_("Empty Slot."))
                           + "\n"
                           + FileSaveName(i)) style "large_button_text"


◇ Экран preferences[править | править код]

Экран preferences используется для выбора параметров, управляющих отображением игры.

В общем, экран preferences – либо действия, либо значения панели, возвращаемые из Preference().

screen preferences():

    tag menu

    # Включает навигацию.
    use navigation

    # Поместите навигационные столбцы в сетку из трёх элементов.
    grid 3 1:
        style_prefix "prefs"
        xfill True

        # Левая колонка.
        vbox:
            frame:
                style_prefix "pref"
                has vbox

                label _("Режим экрана")
                textbutton _("Окно") action Preference("display", "window")
                textbutton _("Полноэкранный режим") action Preference("display", "fullscreen")

            frame:
                style_prefix "pref"
                has vbox

                label _("Переходы")
                textbutton _("Все") action Preference("transitions", "all")
                textbutton _("Никакие") action Preference("transitions", "none")

            frame:
                style_prefix "pref"
                has vbox

                label _("Скорость текста")
                bar value Preference("text speed")

            frame:
                style_prefix "pref"
                has vbox

                textbutton _("Джойстик...") action ShowMenu("joystick_preferences")

        vbox:

            frame:
                style_prefix "pref"
                has vbox

                label _("Пропуск")
                textbutton _("Увиденные сообщения") action Preference("skip", "seen")
                textbutton _("Все сообщения") action Preference("skip", "all")

            frame:
                style_prefix "pref"
                has vbox

                textbutton _("Начать пропуск") action Skip()

            frame:
                style_prefix "pref"
                has vbox

                label _("После выбора")
                textbutton _("Остановить пропуск") action Preference("after choices", "stop")
                textbutton _("Продолжить пропуск") action Preference("after choices", "skip")

            frame:
                style_prefix "pref"
                has vbox

                label _("Скорость авточтения")
                bar value Preference("auto-forward time")

        vbox:

            frame:
                style_prefix "pref"
                has vbox

                label _("Громкость музыки")
                bar value Preference("music volume")

            frame:
                style_prefix "pref"
                has vbox

                label _("Громкость звука")
                bar value Preference("sound volume")
                textbutton "Тест" action Play("sound", "sound_test.ogg") style "soundtest_button"

            frame:
                style_prefix "pref"
                has vbox

                label _("Громкость голоса")
                bar value Preference("voice volume")
                textbutton "Тест" action Play("voice", "voice_test.ogg") style "soundtest_button"

style pref_frame:
    xfill True
    xmargin 5
    top_margin 5

style pref_vbox:
    xfill True

style pref_button:
    size_group "pref"
    xalign 1.0

style pref_slider:
    xmaximum 192
    xalign 1.0

style soundtest_button:
    xalign 1.0


◇ Экран confirm[править | править код]

Экран confirm используется, чтобы задать игроку вопрос «Да/Нет». Принимает следующие параметры:

message
Сообщение для отображения игроку. Это одно из:
  • gui.ARE_YOU_SURE - "Вы уверены?" Должно быть значение по умолчанию, если сообщение неизвестно.
  • gui.DELETE_SAVE - "Вы уверены, что хотите удалить это сохранение?"
  • gui.OVERWRITE_SAVE - "Вы уверены, что хотите перезаписать своё сохранение?"
  • gui.LOADING - "Загрузка потеряет несохраненный прогресс. Вы уверены, что хотите это сделать?"
  • gui.QUIT - "Вы уверены, что хотите выйти?"
  • gui.MAIN_MENU - "Вы уверены, что хотите вернуться в главное меню? Это приведёт к потере несохраненного прогресса."
  • gui.END_REPLAY - "Вы уверены, что хотите закончить повтор?"
  • gui.SLOW_SKIP - "Вы уверены, что хотите начать пропуск?"
  • gui.FAST_SKIP_SEEN - "Вы уверены, что хотите перейти к следующему выбору?"
  • gui.FAST_SKIP_UNSEEN - "Вы уверены, что хотите пропустить неувиденный диалог для следующего выбора?"
Значения переменных являются строками, что означает, что они могут отображаться с использованием отображаемого текста.
yes_action
Действие, которое выполняется, когда игрок выбирает "Да".
no_action
Действие, которое выполняется, когда игрок выбирает "Нет".


До Ren'Py 6.99.10 этот экран был известен как экран yesno_prompt. Если экран confirm отсутствует, то вместо него используется yesno_prompt.

screen confirm(message, yes_action, no_action):

    modal True

    window:
        style "gm_root"

    frame:
        style_prefix "confirm"

        xfill True
        xmargin 50
        ypadding 25
        yalign .25

        vbox:
            xfill True
            spacing 25

            text _(message):
                text_align 0.5
                xalign 0.5

            hbox:
                spacing 100
                xalign .5
                textbutton _("Да") action yes_action
                textbutton _("Нет") action no_action

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

Статья "Special Screen Names" на английском языке.


На главную страницу Официальная документация движка Вернуться к началу статьи