Моргание и открывание рта (Blink And Lip Flap)

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

Что делать, если у вас есть персонаж и вы хотите, чтобы он периодически моргал, а его рот двигался, когда он говорит?

Сначала добавьте код для анимации рта в отдельную часть вашего скрипта:

init python:
    # Здесь устанавливается имя персонажа, которой говорит или
    # значение None, если ни один персонаж в настоящий момент не говорит.
    speaking = None
  
    # Возвращает значение speaking, если персонаж говорит, и значение done, если 
    # персонаж молчит.
    def while_speaking(name, speak_d, done_d, st, at):
        if speaking == name:
            return speak_d, .1
        else:
            return done_d, None
  
    # Производная форма вышеуказанного кода.
    curried_while_speaking = renpy.curry(while_speaking)
  
    # Выводит speaking, когда названный персонаж говорит, а иначе - done.
    def WhileSpeaking(name, speaking_d, done_d=Null()):
        return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))
  
    # Обратный вызов содержит переменную speaking.
    def speaker_callback(name, event, **kwargs):
        global speaking
       
        if event == "show":
            speaking = name
        elif event == "slow_done":
            speaking = None
        elif event == "end":
            speaking = None
  
    # Производная форма того же кода.
    speaker = renpy.curry(speaker_callback)

Далее, определяется персонаж и его изображение. При рисовании персонажа, разделим его спрайт на тело, глаза и рот. (359, 927) – длина и высота персонажа. (101, 50) – смещение по оси Y и X от верхнего левого угла для моргающих глаз, тогда как (170, 144) – смещение по оси Y и X для движения губ.

Если слои с глазами и ртом того же размера, что и собственные глаза и рот самого персонажа, смещение по оси Y и X должно быть (0, 0).

 # Создайте такого персонажа.
 define girl = Character("Girl", callback=speaker("girl"))
  
 # Соединение элементов, чтобы сделать моргающего и открывающего рот персонажа
 image girl normal = LiveComposite(
    (359, 927),
    (0, 0), "base.png",
    (101, 50), "girl eyes normal",
    (170, 144), WhileSpeaking("girl", "girl mouth normal", "mouth_closed.png"),
    )

 image girl eyes normal:
    "eye_open.png"
    choice:
        4.5
    choice:
        3.5
    choice:
        1.5
    # Рандомизирует период времени между морганием.
    "eye_closed.png"
    .25
    repeat

 image girl mouth normal:
    "mouth_speak1.png"
    .2
    "mouth_speak2.png"
    .2
    repeat

Теперь выбранный персонаж будет говорить и моргать машинально. Если вы хотите, чтобы персонаж только открывал рот, удалите "girl eyes normal" из вышеуказанного кода, включая LiveComposite.

 # Игра начинается здесь.
 label start:  
    scene black
    show girl normal
  
    "Молчит."
  
    girl "Сейчас я разговариваю. Бла-бла-бла-бла-бла."
  
    "Замолчала."
   
    girl "Сейчас я вновь разговариваю. Бла-бла-бла-бла-бла-бла-бла."

Этот код был адаптирован из первоначального кода, созданного PyTom в этой теме.

Источник[править | править код]

Статья "Blink And Lip Flap" на английском языке


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