Несколько текстбоксов
Перейти к навигации
Перейти к поиску
Допустим, мы хотим, чтобы на экране появлялись реплики сразу нескольких персонажей. Вот самый простой способ это организовать. Преимущества данного метода:
- На экране может быть любое количество диалогов
- Позиция и ширина/высота окошек определяются автоматически
- Настраивается внешний вид диалога, отступы, фон
- На экране может не отображаться основной текстбокс
- Диалоги не исчезнут при нажатии «h»
- При автоматическом создании файла перевода, текст диалогов переводится
init -3 python:
# окно игры в центре экрана
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
# автоматическое объявление изображений
config.automatic_images_minimum_components = 1
config.automatic_images = [' ', '_', '/']
config.automatic_images_strip = ['images']
init python:
# сначала оформим основной текстбокс:
# шрифт игры
style.default.font = "anime.ttf"
# красивые толстенькие кнопки в игре
style.button.ypadding = 8
style.button.xpadding = 16
# цвет текста в текстбоксе
style.say_thought.color = "#000"
# отступы для текстбокса
hpad = 40
vpad = 64
# фон основного окна
style.window.background = Frame("frame", hpad, vpad)
# минимальный размер текстбокса
style.window.yminimum = 200
# а теперь сами дополнительные диалоги:
# отступы текста внутри рамки текстбокса
style.window.left_padding = hpad
style.window.right_padding = hpad
style.window.top_padding = vpad
style.window.bottom_padding = vpad
# список для текста в окошках
whats = [""]
# отступы для растягивания рамки диалогов
hpad2 = 50
vpad2 = 28
# количество дополнительных окошек
# т.е. количество разделителей «|»
whats_count = 0
# разделитель текста диалогов
divider = "|"
# рубим текст на количество диалоговых окон
def SplitF(txt):
global whats, whats_count
if txt:
whats = txt.split(divider)
else:
whats = [""]
whats_count = len(whats) - 1
# превращаем в action
Split = renpy.curry(SplitF)
# стандартный экран с текстбоксом, но с добавлением
# парсера строки и распределением кусков текста по окошкам
screen say:
# Умолчания для side_image и two_window
default side_image = None
default two_window = False
# считываем данные из текстбокса
on "show" action Split(what)
# Решаем, нужен ли нам двухоконный или однооконный вариант.
if not two_window:
# Вариант с одним окном.
window:
id "window"
if not whats[0]:
background None
vbox:
style "say_vbox"
if who:
text who id "who"
text whats[0] id "what" # выводим первое окошко
else:
# Вариант с двумя окнами.
vbox:
style "say_two_window_vbox"
if who:
window:
style "say_who_window"
text who:
id "who"
window:
id "window"
if not whats[0]:
background None
vbox:
style "say_vbox"
text whats[0] id "what" # выводим первое окошко
# Если есть изображение, отобразить его над текстом.
if side_image:
add side_image
else:
add SideImage() xalign 0.0 yalign 1.0
# выводим данные в дополнительные диалоговые окошки
if whats_count > 0:
hbox:
for i in range(1, whats_count + 1):
if whats[i]:
# текст в окошках
frame:
text _(whats[i]) xalign .5 color "#000"
# ширина экрана / количество разделителей = ширина окон
xminimum (config.screen_width / whats_count)
xmaximum (config.screen_width / whats_count)
# отступы для текста от краев рамки
left_padding vpad2
right_padding vpad2
top_padding vpad2
bottom_padding vpad2
# фон окошек
background Frame("bubble", hpad2, vpad2)
else:
# нет текста, пустой диалог, без фона
frame:
text _("")
xminimum (config.screen_width / whats_count)
background None
# Использовать быстрое меню.
use quick_menu
label start:
scene bg street
"Текст в основном окне."
show girl1 at left with moveinleft
"Текст в основном окне.|Диалог 1 (на всю ширину)"
show girl2 with dissolve
"Текст в основном окне.||Диалог 2\nСтрока 2|"
show girl3 at right with moveinright
"Текст в основном окне.|||Диалог 3"
"Текст в основном окне.|Диалог 1|Диалог 2\nСтрока 2|Диалог 3"
hide girl1
hide girl3
with dissolve
"||Без основного текста.|"
return
- Ссылка на архив с проектом: test-dialogues.zip
- Источник: Renpy для чайников: Несколько текстбоксов
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Renpy для чайников | Вернуться к началу статьи |