И снова говорящие головы

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

# модуль содержит конструктор персонажей,
# который перебирает всех персонажей из списка,
# прикручивает им головы из списка эмоций
# и создает самого персонажа
# в папке images должна быть папка side
# в ней подпапки с именами персонажей для хранения их эмоций
# а так же в папке images должны быть файлы тел с именами персонажей,
# но без голов

# чтобы воспользоваться модулем вам нужно всего лишь заполнить список
# chars кортежами из имени спрайта, имени персонажа и цвета имени
# ("dane", _(u"Дэйн Торсон"), "#fff")

init python:
    # автоматическое объявление изображений
    config.automatic_images_minimum_components = 1
    config.automatic_images = [' ', '_', '/']
    config.automatic_images_strip = ["images"]

    # список героев, которых нужно сконструировать
    # псевдоним для спрайтов и имя на экране
    chars = [("dane", _(u"Дэйн Торсон"), "#fff"), ("vera", _(u"Вера"), "#cdf")]

    # список доступных эмоций
    zemo = ["ok", "angry", "smile"]

    # размеры спрайта по умолчанию
    default_width = 600
    default_height = 1080

    # отступы к голове по умолчанию
    # на случай, если изображения головы будут меньше, чем на спрайте
    default_xoffset = 0
    default_yoffset = 0

    # всё, что дальше менять не стоит :)

    # конструктор персонажа
    def make_character(name, width=default_width, height=default_height, xoffset=default_xoffset, yoffset=default_yoffset):
        # перебираем эмоции
        for emo in zemo:
            # имя спрайта для эмоции
            face = "side " + name + " " + emo
            # тело/основа + эмоция
            args = [(width, height), (0, 0), name, (xoffset, yoffset), face]
            # собираем в спрайт
            renpy.image(name + " " + emo, LiveComposite(*args, align=(.5, 1.0)))

    # собрать всех персонажей
    for nick, name, color in chars:
        # собираем большие спрайты из безголового тела и голов с эмоциями
        if nick == "vera":
            # спрайт-исключение
            make_character(nick, 950, 1080, 250)
        else:
            # стандартные спрайты
            make_character(nick)
        # голова для пустой эмоции из ok.png
        renpy.copy_images("side " + nick + " ok", "side " + nick)
        # задаем персонажу имя и говорящую голову
        # можно добавить цвет имени и прочие атрибуты персонажей
        globals()[nick] = Character(name, image=nick, who_color=color)

init:
    transform ax(x=.5):
        xalign x

# Игра начинается здесь:
label start:
    scene bg caffee
    show dane ok
    with dissolve

    dane "Привет, я - Дэйн Торсон. Это пример того, как в Ren'Py сделать говорящие головы."

    dane angry "Сейчас я должен разозлиться."

    dane smile "Теперь - улыбнуться."

    show dane smile at ax(.25)
    show vera ok at ax(.75)
    with moveinright
    vera "А я - Вера. Желаю всем здравствовать."

    vera smile "Я здесь в качестве исключения. Как большой спрайт, из которого вырезали головы на некотором расстоянии от края."

    return

Комментарии