Экраны

Предисловие

Экраны имеют две основные функции:

  • Отображение информации. С помощью различных панелей, изображений или вовсе текста. Например, экран диалогов (say) используется для вывода диалога с пользователем и показывает имя говорящего.
  • Взаимодействие. Различные кнопки и панели, показанные экраном, позволяют игроку совершать различные действия или менять какие-либо значения.

Экраны могут отображаться четырьмя способами:

  • Неявно, как, например, экран say.
  • Явно, используя операторы, вызывающие отображение других экранов.
  • Автоматически. Например, экран с именем main_menu будет автоматически вызываться, когда игрок вернётся в главное меню игры или модификации, если она, конечно, заменяет этот экран на свой.
  • Как действие, связанное с любой кнопкой. Например, можно привязать появление какого-либо экрана к нажатию правой/левой кнопки мыши или клавиши.

Язык экрана

Он состоит из оператора, объявляющего новый экран (screen), операторов, добавляющих отображаемые объекты на этот экран (например, add или imagebutton), и операторов управления (xalign, yalign, spacing).

Пример экрана:

screen test_screen:
    tag test
    modal True

    add "test bg"

В этом примере первая строка — оператор screen, который используется для объявления экрана. Не забываем про то, что необходимо дать экрану имя. Оператор tag задаёт "тэг" для этого окна: если вызывается ещё один экран с таким же тэгом, он заменяет предыдущий. Оператор modal при значении True не позволяет игроку взаимодействовать с отображаемыми объектами "под" экраном, оставляя игроку взаимодействие лишь с кнопками или объектами внутри самого экрана. Оператор add добавляет изображение или любой отображаемый объект на экран. Возможно расположение по указанным координатам, благодаря стандартным командам из трансформов (align, pos и прочее).

Синтаксис языка экрана

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

  • Список свойств (modal True, tag menu, sensitive).
  • Операторы языка экрана (imagebutton, textbutton, text и прочее).

Операторы-кнопки

button, imagebutton, textbutton — все эти операторы позволяют создать внутри экрана кнопку, которой можно задать свойства (hover, idle, action и т. д.). Как понятно из названия, imagebutton создаёт кнопку-изображение, textbutton — текстовую кнопку, а button — просто область экрана, при нажатии на которую будет выполнено какое-либо действие, указанное для такой кнопки.

Пример экрана с кнопками:

screen my_screen:
    tag menu
    modal True

    add "black"

    textbutton "Текстовая кнопка":
        align(0.5, 0.5) # Располагаем кнопку по центру экрана

    imagebutton:
        align(0.1, 0.1) # Располагаем кнопку в левом верхнем углу экрана
        idle "Путь до изображения-кнопки в состоянии 'не наведена мышка'"
        hover "Путь до изображения-кнопки в состоянии 'наведена мышка'"
        action NullAction() # Даём кнопке "нулевое действие"  при нажатии ничего не происходит.

Оператор "auto"

Также, если вы не хотите прописывать idle- и hover-версии в две строчки, можно воспользоваться оператором auto, который автоматически находит idle- и hover-версии кнопки в зависимости от названия.

Учтите, что в названиях изображений кнопки должны присутствовать слова idle и hover.

Пример:

screen my_screen:
    tag menu
    modal True

    imagebutton:
        auto "mymod/buttons/my_button_%s.png" # Слово, на которое опирается оператор `auto`, находится в конце. То бишь названия кнопок с `idle`- и `hover`-версиями  my_button_idle и my_button_hover.

Полный список действий (action), которые можно дать кнопкам, можно найти здесь.

Операторы экрана

В дополнение к оператору screen есть три оператора, которые работают с экранами. Это show screen, call screen и hide screen.

Оператор show screen вызывает отображение экрана. Возможно использование with. Также их можно вызывать с какими-либо параметрами. Например, show screen my_screen(_layer = "screens").

screen my_screen:
    add "black"

label my_mod:
    show screen my_screen with dissolve # Показываем экран с растворением в 0.5 секунды.

Учтите, что экраны (screen) прописываются вне блока лейбла. Можно прописать вне всяких блоков, а также внутри блока init.

Показанные таким образом экраны отображаются до тех пор, пока они не будут скрыты командой hide screen.

Оператор hide screen используется для скрытия экрана, который отображается в данный момент. Возможно использование with.

screen my_screen:
    add "black"

label my_mod:
    show screen my_screen with dissolve # Показываем экран с растворением в 0.5 секунды.
    pause(2) # Пауза 2 секунды
    hide screen my_screen with dissolve # Убираем экран с растворением в 0.5 секунды.

Оператор call screen показывает экран, а затем снова скрывает его, как только с ним закончится взаимодействие (скажем, когда будет произведён прыжок на другой лейбл). Убрать экран можно также с помощью действия return (или Return(), если мы говорим о действии для кнопки. При нажатии на неё экран будет скрыт. Если же экран был показан с помощью show screen — нас выбросит в главное меню игры). Возможно использование with.

screen my_screen:
    add "black"

    textbutton "Нажми!":
        action Return() # Закрываем экран при нажатии на кнопку.

label my_mod:
    call screen my_screen with dissolve # Показываем экран с растворением в 0.5 секунды. Как только будет нажата кнопка, экран будет закрыт.

Различие между Show и ShowMenu при задании действия для кнопки

Если внутри экрана мы откроем ещё один экран, который при нажатии на кнопку был вызван действием Show (Show("my_screen")) и затем нажмём на кнопку с действием Return(), то нас выбросит в главное меню. Но! Если мы также вызовем экран, но с действием ShowMenu (ShowMenu("my_screen")), то при нажатии на кнопку с Return() внутри второго экрана нас возвратит обратно на предыдущий экран. Удобно!

screen my_screen:
    add "black"

    textbutton "Нажми!":
        action Show("my_screen2") # Открываем экран "my_screen2"

screen my_screen2:
    add "black"

    textbutton "Нажми!":
        action Return() # Нас выбрасывает в главное меню игры.

и

screen my_screen:
    add "black"

    textbutton "Нажми!":
        action ShowMenu("my_screen2") # Открываем экран "my_screen2"

screen my_screen2:
    add "black"

    textbutton "Нажми!":
        action Return() # Нас возвращает обратно на экран "my_screen"