Выделение говорящего цветом (версия 2)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску
Talk.png

Преимущества данного способа
  • Renpy сам определяет, говорит ли персонаж в данный момент, значительно сокращается размер кода в скрипте новеллы
  • Можно использовать уже объявленные изображения, а не только файлы спрайтов


Недостатки
  • При объявлении персонажа и его спрайта нужно использовать дополнительные параметры, функции
  • Изменяется только цвет, размеры остаются прежними
init python:
    # автоматическое объявление картинок из модуля 7dots.rpy (без него проект не будет работать)
    images_auto()
    window_center()

    # переменная для хранения имени говорящего
    speaking = None

    # степень яркости цветов, 1.0 - полноцвет
    blind = .35

    # для выбора состояния спрайта - полноцвет/бледный
    def while_speaking(name, speak_d, done_d, st, at):
        if speaking == name:
            # цветной, если говорит в данный момент
            return speak_d, None
        else:
            # бледный, если молчит (функция из модуля 7dots.rpy)
            done_d = LiveBlind(speak_d, blind)
            return done_d, None
    curried_while_speaking = renpy.curry(while_speaking)

    # для создания динамического изображения, состояние которого зависит от переменной
    def WhileSpeaking(name, speaking_d):
        return DynamicDisplayable(curried_while_speaking(name, speaking_d, speaking_d))

    # для определения имени персонажа, который в данный момент что-то говорит
    # имя сохраняется в переменной speaking
    def speaker_callback(name, event, **kwargs):
        global speaking
        if event == "show":
            speaking = name
        elif event == "end":
            speaking = None
    Speaker = renpy.curry(speaker_callback)

init:
    # задаем имя персонажа и привязываем его к персонажу, который умеет менять цвет
    define b = Character(u"Мальчик", callback=Speaker("b"), color="#64f")
    # создаем изображение, которое привязано к созданному выше персонажу
    # "boy ok0" - имя объявленной картинки спрайта, эквивалентно images/boy_ok0.png для необъявленной
    image boy ok = WhileSpeaking("b", "boy ok0")
    # то же для остальных персонажей
    define g = Character(u"Девочка", callback=Speaker("g"), color="#f22")
    image girl ok = WhileSpeaking("g", "girl ok0")

# обычное использование спрайтов
label start:
    scene black with None

    scene bg1
    show boy ok at left2
    show girl ok at right2
    with dissolve
    "Поехали."

    b "Я - мальчик. Я цветной, но только когда говорю."

    g "Я - девочка. Я тоже цветная, только когда говорю."

    "А пока они молчат - оба бледные, как поганки."

    scene black
    with dissolve
    return

На главную страницу Книга рецептов Энциклопедии Ren'Py Renpy для чайников Вернуться к началу статьи