Речевые пузыри
Ren'Py поддерживает диалоги, отображаемые в речевых пузырях, которые можно интерактивно располагать на экране. Это является альтернативой текстовым окнам, используемым в играх в стиле ADV, и полноэкранным диалогам, используемым в режиме NVL.
Чтобы использовать речевые пузыри в своей игре, вам нужно будет определить персонажей (Characters) с тегом изображения и типом (kind) bubble. Например,
define e = Character(None, image="eileen", kind=bubble) # Eileen
define l = Character(None, image="lucy", kind=bubble) # Lucy
Хотя имя поддерживается, в целом говорящий персонаж будет подразумеваться по хвостику пузыря, поэтому имя можно опустить.
Затем вы можете использовать этих персонажей для написания диалогов как обычно.
Чтобы расположить пузыри, нажмите shift+B, чтобы отобразить редактор речевых пузырей. Для каждого персонажа, у которого есть речевой пузырь, в этом редакторе будут две кнопки.
Нажатие на кнопку области запустит редактор речевых пузырей. Этот редактор позволяет вам перетаскиванием выбрать область на сетке, где будет размещен речевой пузырь. Когда вы завершите перетаскивание, речевой пузырь изменит свое положение.
Нажатие на кнопку свойств будет переключать между наборами свойств, связанных с речевым пузырем. Для стандартного речевого пузыря разные свойства контролируют положение хвостика пузыря.
После того как вы изменили область или свойства для персонажа (или группы персонажей с одинаковыми тегами изображений), эти свойства остаются установленными до тех пор, пока не будут изменены снова или до следующего оператора scene.
Когда область или свойства устанавливаются для текущей строки диалога, соответствующая кнопка становится ярче. Если значения наследуются от предыдущей строки диалога или по умолчанию, кнопка затемнена. Щелчок правой кнопкой мыши по кнопке предотвратит установку значения для текущей строки.
Сохраняемые пузыри
Ren'Py поддерживает режим, в котором пузыри сохраняются между строками диалога, так что они появляются один за другим, пока предыдущие пузыри не будут убраны с экрана. Чтобы включить этот режим, установите свойство retain персонажа с пузырем в True:
define e = Character(None, image="eileen", kind=bubble, retain=True)
После этого пузыри будут продолжать появляться. Каждый пузырь нужно будет размещать индивидуально, чтобы пузыри не перекрывались. В редакторе пузырей нажатие на кнопку «(clear retained bubbles)» удалит с экрана все сохраненные пузыри, кроме самого последнего.
Советы
Речевые пузыри используют те же идентификаторы, что и система перевода. См. Советы по переводу для получения дополнительной информации о них. Эти идентификаторы могут измениться, если:
Изменится текст строки.
Будет добавлена или удалена другая строка с тем же текстом в той же метке.
Будет добавлена или удалена метка перед строкой (однако, добавление или удаление метки с оговоркой
hideне изменит идентификатор перевода).
Если вы редактируете сцену, рекомендуется проиграть её, чтобы убедиться, что изменения не повлияли на расположение речевых пузырей.
Можно применять трансформации к речевому пузырю, редактируя экран Экран bubble.
Если вы хотите, чтобы индикатор CTC был частью экрана пузыря, рассмотрите возможность передать аргументу ctc_position в Character значение «screen-variable». Вам также может потребоваться добавить:
showif ctc:
add ctc
в конец экрана пузыря, если этого там нет. Тогда вам нужно будет определить персонажа так:
- define e = Character(
None, image="eileen", kind=bubble, ctc_position="screen-variable", ctc=Transform("ctc_image.png", align=(0.5, 1.0))
Переменные конфигурации
Система речевых пузырей управляется переменными в пространстве имён bubble, а также экраном bubble и связанными с ним стилями.
Пространство имён bubble содержит следующие переменные:
- bubble.area_property = "window_area"
Имя свойства, которое содержит область речевого пузыря. Это задаётся так, как если бы оно было передано в
Character(), с той же системой префиксов. По умолчанию это"window_area", что означает, что область передается как свойство отображаемому элементу window. Другой полезный выбор —"show_area", что приведет к тому, что область будет передана как аргумент area экрану пузыря.
- bubble.clear_retain_statements = [ "call screen", "menu", "say", "say-centered", "say-nvl", "scene", ]
Это список операторов, которые будут автоматически вызывать очистку сохраняемых пузырей.
- bubble.cols = 24
Детализация сетки, которая используется для позиционирования и изменения размера речевых пузырей, в горизонтальном направлении.
- bubble.db_filename = "bubble.json"
Файл базы данных, хранящийся в директории игры, который содержит информацию о речевых пузырях.
- bubble.default_area = (15, 1, 8, 5)
Это область по умолчанию, в которой размещаются речевые пузыри, если не указана другая область. Это кортеж вида (x, y, w, h), где каждое значение — это количество ячеек сетки.
- bubble.expand_area = { ... }
Это словарь, сопоставляющий имя набора свойств с кортежем (left, top, right, bottom). Если найдено в этом наборе, область речевого пузыря расширяется на указанное количество пикселей.
Это делает речевой пузырь больше, чем область, которую выделил создатель. Предполагается, что это можно использовать для выделения тела речевого пузыря, не беспокоясь о хвостике, а также для того, чтобы сам текст оставался на месте, когда меняется набор свойств и хвостик перемещается.
По умолчанию это:
define bubble.expand_area = { "bottom_left" : (0, 0, 0, 22), "bottom_right" : (0, 0, 0, 22), "top_left" : (0, 22, 0, 0), "top_right" : (0, 22, 0, 0), }
- bubble.layer = "screens"
Слой, на который помещаются несохраняемые пузыри.
- bubble.properties = { ... }
Это свойства, помимо области, которые можно использовать для настройки речевого пузыря. Это словарь, сопоставляющий имя набора свойств со словарём свойств и значений. Эти свойства заменяют те, что переданы персонажу, а затем передаются на экран
bubble.Здесь используется та же система префиксов, что и в
Character(). Свойства, начинающиеся сwindow_, получают удалённый префикс и передаются отображаемому элементу с id «window» на экране пузыря, который является самим пузырем. Свойства сwhat_получают удалённый префикс и передаются отображаемому элементу с id «what» на экране пузыря, который является текстом пузыря. Свойства сwho_обрабатываются аналогично и передаются имени персонажа. Свойства сshow_передаются в качестве аргументов самому экрану пузыря.В новой игре файл screens.rpy включает:
define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95) define bubble.properties = { "bottom_left" : { "window_background" : Transform(bubble.frame, xzoom=1, yzoom=1), "window_bottom_padding" : 27, }, "bottom_right" : { "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1), "window_bottom_padding" : 27, }, "top_left" : { "window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1), "window_top_padding" : 27, }, "top_right" : { "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1), "window_top_padding" : 27, }, }
Переменная bubble.frame используется только для упрощения определения bubble.properties. Затем для каждого из четырех стилей пузыря, пузырь переворачивается так, чтобы хвостик был в нужном месте, и отступ корректируется, чтобы оставить место для хвостика.
- bubble.properties_order = [ ]
Это список имен наборов свойств в том порядке, в котором они должны переключаться в редакторе речевых пузырей. Если имена наборов свойств не указаны, свойства переключаются в алфавитном порядке.
- bubble.properties_callback = None
Если не None, это должна быть функция, которая принимает тег изображения и возвращает список или кортеж имен свойств, которые должны использоваться для этого тега изображения, в том порядке, в котором эти имена должны переключаться. Это имеет приоритет над bubble.properties_order и может использоваться для настройки списка свойств пузыря для каждого персонажа.
- bubble.retain_layer = "screens"
Слой, на который помещаются сохраняемые пузыри.
- bubble.rows = 24
Детализация сетки, которая используется для позиционирования и изменения размера речевых пузырей, в вертикальном направлении.
Экран bubble
Стандартный экран bubble можно найти в screens.rpy, и он похож
на стандартный экран say:
screen bubble(who, what):
style_prefix "bubble"
window:
id "window"
if who is not None:
window:
id "namebox"
style "bubble_namebox"
text who:
id "who"
text what:
id "what"
Он отделен от экрана say, так как использует собственный набор стилей, включая
bubble_window, bubble_what, bubble_namebox и bubble_who.
Эти стили можно настраивать напрямую, чтобы избежать необходимости устанавливать
свойство во всех наборах свойств в bubble.properties.
Если вы хотите применять эффекты к речевому пузырю, вы можете сделать это, добавив трансформацию на экран пузыря, которая принимает события трансформации show и hide, например:
screen bubble(who, what):
style_prefix "bubble"
window:
id "window"
at transform:
on show:
alpha 0.0
linear .5 alpha 1.0
on hide:
linear .5 alpha 0.0
if who is not None:
window:
id "namebox"
style "bubble_namebox"
text who:
id "who"
text what:
id "what"
Добавление поддержки речевых пузырей в игру
Игры, созданные до выхода Ren'Py 8.1, не будут включать стандартные экраны и настройки, необходимые для системы речевых пузырей. Есть две вещи, которые нужно сделать, чтобы это исправить. Во-первых, скачайте:
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/bubble.png
https://raw.githubusercontent.com/renpy/renpy/master/gui/game/gui/thoughtbubble.png
И поместите файлы в директорию game/gui вашей игры. Затем добавьте
это в конец файла screens.rpy:
## Bubble screen ###############################################################
##
## The bubble screen is used to display dialogue to the player when using
## speech bubbles. The bubble screen takes the same parameters as the say
## screen, must create a displayable with the id of "what", and can create
## displayables with the "namebox", "who", and "window" ids.
##
## https://www.renpy.org/doc/html/bubble.html#bubble-screen
screen bubble(who, what):
style_prefix "bubble"
window:
id "window"
if who is not None:
window:
id "namebox"
style "bubble_namebox"
text who:
id "who"
text what:
id "what"
style bubble_window is empty
style bubble_namebox is empty
style bubble_who is default
style bubble_what is default
style bubble_window:
xpadding 30
top_padding 5
bottom_padding 5
style bubble_namebox:
xalign 0.5
style bubble_who:
xalign 0.5
textalign 0.5
color "#000"
style bubble_what:
align (0.5, 0.5)
text_align 0.5
layout "subtitle"
color "#000"
define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)
define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55)
define bubble.properties = {
"bottom_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
"window_bottom_padding" : 27,
},
"bottom_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
"window_bottom_padding" : 27,
},
"top_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
"window_top_padding" : 27,
},
"top_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
"window_top_padding" : 27,
},
"thought" : {
"window_background" : bubble.thoughtframe,
}
}
define bubble.expand_area = {
"bottom_left" : (0, 0, 0, 22),
"bottom_right" : (0, 0, 0, 22),
"top_left" : (0, 22, 0, 0),
"top_right" : (0, 22, 0, 0),
"thought" : (0, 0, 0, 0),
}