Колбэки персонажа
Ren'Py предоставляет возможность выполнять колбэки при возникновении различных событий во время диалога. Это делается путём передачи аргумента callback в Character() или путём установки переменных config.character_callback или config.all_character_callbacks.
Колбэк персонажа вызывается с одним позиционным аргументом — произошедшим событием. Возможные события:
- "begin"
Вызывается в начале инструкции say.
- "show"
Вызывается перед показом каждого сегмента диалога. Диалог может быть разделён на несколько сегментов с помощью текстовых тегов {w} или {p}, но всегда состоит как минимум из одного сегмента.
- "show_done"
Вызывается после показа каждого сегмента диалога.
- "slow_done"
Вызывается после завершения показа медленного текста. Обратите внимание, что это событие может произойти после "end" в случаях, когда диалог не приводит к взаимодействию.
- "interact_done"
Вызывается после завершения взаимодействия. Обратите внимание, что вход в новый контекст (например, игровое меню) не завершает взаимодействие.
- "end"
Вызывается в конце инструкции say.
Колбэк вызывается со следующими именованными аргументами:
- interact
Имеет значение true, если диалог приводит к взаимодействию.
- type
Тип персонажа (например, "nvl", "adv", "bubble").
- what
Текст, который будет передан отображаемому элементу what.
- multiple
Аргумент multiple для
Character().
Колбэкам "show", "slow_done" и "interact_done" также передаются дополнительные именованные аргументы:
- start
Начало текущего сегмента диалога в строке what.
- end
Конец текущего сегмента диалога в строке what.
- delay
Продолжительность паузы Ren'Py после показа текущего сегмента диалога, или None, если Ren'Py будет ожидать клика игрока.
- last_segment
True, если это последний сегмент диалога в инструкции say, иначе False.
Колбэк "interact_done" принимает дополнительный именованный аргумент:
- exception
True, если взаимодействие завершилось из-за исключения, иначе False. Исключения включают такие события, как загрузка игры и откат (rollback).
Колбэку могут быть переданы другие значения позиционного аргумента и дополнительные именованные аргументы. Колбэк должен быть написан так, чтобы игнорировать именованные аргументы, которые он не понимает.
Пример
В этом примере воспроизводятся звуковые сигналы (бипы) вместо голоса персонажа, когда включён медленный вывод текста:
init python:
def beepy_voice(event, interact=True, **kwargs):
if not interact:
return
if event == "show_done":
renpy.sound.play("beeps.ogg")
elif event == "slow_done":
renpy.sound.stop()
define pike = Character("Christopher Pike", callback=beepy_voice)
label start:
pike "So, hanging out on Talos IV, minding my own business, when..."
Для специализации общего колбэка под конкретных персонажей, вы можете передавать аргументы в функцию колбэка с префиксом cb_:
init python:
def boopy_voice(event, interact=True, boopfile="normal_boop.ogg", **kwargs):
if not interact:
return
if event == "show_done":
renpy.sound.play(boopfile)
elif event == "slow_done":
renpy.sound.stop()
define chrisjen = Character("Chrisjen", callback=boopy_voice)
define nagata = Character("Naomi", callback=boopy_voice, cb_boopfile="sfx-blipmale.ogg")