Экраны
Предисловие
Экраны имеют две основные функции:
- Отображение информации. С помощью различных панелей, изображений или вовсе текста. Например, экран диалогов (
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"