Несколько текстбоксов

Допустим, мы хотим, чтобы на экране появлялись реплики сразу нескольких персонажей. Вот самый простой способ это организовать. Преимущества данного метода:

  • На экране может быть любое количество диалогов
  • Позиция и ширина/высота окошек определяются автоматически
  • Настраивается внешний вид диалога, отступы, фон
  • На экране может не отображаться основной текстбокс
  • Диалоги не исчезнут при нажатии «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

Комментарии

  1. Работает на 6.99 , на 7.21 - нет. Но мне интереснее другое, как в такой реализации задавать разные стили для разных персонажей?

    ОтветитьУдалить
  2. Сделайте пожалуйста работу этого кода под новую версию ренпай

    ОтветитьУдалить

Отправить комментарий