Допустим, мы хотим, чтобы на экране появлялись реплики сразу нескольких персонажей. Вот самый простой способ это организовать. Преимущества данного метода:
- На экране может быть любое количество диалогов
- Позиция и ширина/высота окошек определяются автоматически
- Настраивается внешний вид диалога, отступы, фон
- На экране может не отображаться основной текстбокс
- Диалоги не исчезнут при нажатии «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
скрипт не рабочий
ОтветитьУдалитьРаботает на 6.99 , на 7.21 - нет. Но мне интереснее другое, как в такой реализации задавать разные стили для разных персонажей?
ОтветитьУдалитьСделайте пожалуйста работу этого кода под новую версию ренпай
ОтветитьУдалитьEstoy de acuerdo con el de arriba.
ОтветитьУдалить