Инструменты разработчика
Ren'Py включает в себя ряд функций, облегчающих жизнь разработчику. Для работы многих из них необходимо, чтобы переменная config.developer была установлена в True.
Lint
Инструмент Lint (доступный из лаунчера) проверяет игру на наличие потенциальных ошибок или неоптимальных решений и даёт команде разработчиков советы по её улучшению. Поскольку некоторые из этих ошибок могут затрагивать только пользователей на других платформах, рекомендуется разобраться со всеми ошибками и исправить их, даже если проблему не удаётся воспроизвести локально.
Lint также содержит полезную информацию и статистику об игре.
Обратите внимание, что использование Lint не заменяет полноценного тестирования.
Консоль (Shift+O)
Консоль отладки позволяет в интерактивном режиме выполнять скрипт Ren'Py и инструкции Python, и немедленно видеть результаты. Консоль доступна в режиме разработчика или когда config.console имеет значение True, и вызывается нажатием Shift+O.
Консоль можно использовать, чтобы:
Переходить к метке.
Интерактивно пробовать выполнять инструкции скрипта Ren'Py.
Вычислять выражение или выполнять инструкцию Python, чтобы увидеть результат.
Отслеживать (трассировать) выражения Python по ходу игры.
commands:
clear: очищает историю консоли
escape: Включает экранирование unicode-символов в unicode-строках.
exit: выход из консоли
help: показать эту справку
help <expr>: показать сигнатуру и документацию для <expr>
jump <label>: переходит к метке <label>
load <slot>: загружает игру из слота <slot>
long: Выводит полное представление объектов в консоль.
reload: перезагружает игру, обновляя скрипты
save <slot>: сохраняет игру в слот <slot>
short: Сокращает представление объектов в консоли (по умолчанию).
stack: выводит стек вызовов
unescape: Отключает экранирование unicode-символов в unicode-строках и выводит их как есть (по умолчанию).
unwatch <expression>: прекратить отслеживание выражения
unwatchall: прекратить отслеживание всех выражений
watch <expression>: отслеживать python-выражение
watch short: делает представление отслеживаемых выражений коротким (по умолчанию)
watch long: делает представление отслеживаемых выражений полным
<renpy script statement>: выполнить инструкцию
<python expression or statement>: выполнить выражение или инструкцию
Поддержка редактора (Shift+E)
Нажатие Shift+E открывает текстовый редактор по умолчанию (который задаётся в лаунчере и может быть настроен с помощью Интеграция с текстовым редактором), открывая файл скрипта на строке, где написана текущая инструкция.
Меню разработчика (Shift+D)
Когда config.developer имеет значение True, нажатие Shift+D отобразит меню разработчика, которое предоставляет быстрый доступ к некоторым из приведённых ниже функций.
Перезагрузка (Shift+R)
Когда config.developer имеет значение True, нажатие Shift+R сохранит текущую игру, перезагрузит игровой скрипт и саму игру. Часто это вернёт вас к последней неизменённой инструкции, встреченной до нажатия Shift+R.
После первой перезагрузки игра перейдёт в режим авто-перезагрузки, и любые изменения в файлах, к которым был получен доступ с момента последней перезагрузки, вызовут повторную перезагрузку игры.
Это позволяет разработчику вносить изменения в скрипт с помощью внешнего редактора и не выходить из Ren'Py и перезапускать его, чтобы увидеть эффект от изменений.
Обратите внимание, что состояние игры, включающее значения переменных и списки сцен, сохраняется при перезагрузке. Это означает, что если одна из инструкций, влияющих на них, будет изменена, необходимо выполнить откат и повторно выполнить эту инструкцию, чтобы увидеть новый эффект.
Перезагрузка с помощью Shift+R не работает в режиме повтора (replay).
Следующие функции реализуют то же поведение на чистом Python. Обратите внимание, что они предназначены для использования только в режиме разработчика.
- renpy.get_autoreload()
Получает флаг автоматической перезагрузки.
- renpy.reload_script()
Заставляет Ren'Py сохранить игру, перезагрузить скрипт, а затем загрузить сохранение.
Эту функцию следует вызывать только во время разработки. Она работает на Windows, macOS и Linux, но может не работать на других платформах.
- renpy.set_autoreload(autoreload)
Устанавливает флаг автоматической перезагрузки, который определяет, будет ли игра автоматически перезагружаться после изменений в файлах. Автоматическая перезагрузка не будет полностью включена до тех пор, пока игра не будет перезагружена с помощью
renpy.reload_script().
Инспектор стилей (Shift+I)
Когда config.developer имеет значение True, нажатие Shift+I запустит инспектор стилей. Он отобразит список отображаемых объектов (displayables) под курсором мыши в порядке их отрисовки на экране (то есть, последний объект в списке находится поверх остальных). Для каждого отображаемого объекта будет показан его тип, используемый стиль и размер, с которым он отрисовывается.
Нажатие на имя стиля покажет стили, которые наследует данный отображаемый объект, и свойства, которые каждый стиль вносит в итоговый вид объекта.
> Быстрый пропуск
Когда config.developer или config.fast_skipping имеет значение True, нажатие клавиши fast_skip (по умолчанию ">") приводит к немедленному пропуску до следующего важного взаимодействия. Важным взаимодействием для этой цели считается то, которое не вызвано инструкцией say, переходом (transition) или командой pause. Обычно это означает пропуск до следующего меню, но он также остановится при возникновении определённых пользователем форм взаимодействия.
Переход к строке
Ren'Py поддерживает переход к определённой строке в скрипте, что избавляет разработчика от необходимости проходить всю игру, чтобы добраться до неё. Хотя с этим методом перехода связан ряд предостережений, он всё равно может быть полезен для создания "живого" предпросмотра.
Чтобы выполнить переход, запустите Ren'Py с аргументом командной строки --warp, за которым следует комбинация имя_файла:номер_строки, чтобы указать, куда вы хотите переместиться. Например:
renpy.exe my_project --warp script.rpy:458
(Где my_project — это полный путь к базовому каталогу вашего проекта.)
При выполнении перехода Ren'Py совершает несколько действий. Сначала он находит все инструкции scene в программе. Затем он пытается найти путь от этих инструкций scene до каждой достижимой инструкции в игре. После этого он выбирает достижимую инструкцию, которая находится ближе всего к указанной строке (но не после неё). Он проходит в обратном порядке от этой инструкции до инструкции scene, записывая пройденный путь. Затем Ren'Py выполняет инструкцию scene и все инструкции show или hide, найденные на этом пути. Наконец, он передаёт управление найденной инструкции.
С функцией перехода (warp) связан ряд довольно серьёзных оговорок. Первая заключается в том, что он анализирует только один путь, а это значит, что, хотя этот путь может быть репрезентативным для какого-то одного маршрута выполнения, на другом маршруте может существовать ошибка. В целом, при построении пути не учитывается игровая логика, поэтому возможно создание пути, который на самом деле недостижим. (Это реальная проблема только для игр с насыщенной логикой управления, особенно для тех, которые активно используют Python).
Однако самая большая проблема заключается в том, что код на Python не выполняется до инструкции, к которой осуществляется переход. Это означает, что все переменные будут неинициализированы, что может привести к сбоям при их использовании. Чтобы преодолеть это, можно определить метку after_warp, которая вызывается после перехода, но до выполнения инструкции, к которой был совершён переход. Эта метка может настроить переменные в программе, а затем вернуться к предпросмотру.
Для работы функции перехода (warp) требуется, чтобы config.developer имела значение True.
Функции отладки
- renpy.filename_line_override(filename: str, line: int)
Временно переопределяет имя файла и номер строки. Это менеджер контекста, используйте его так:
with renpy.filename_line_override("myfile.rpy", 42): # ...
- renpy.get_filename_line()
Возвращает пару (имя файла, номер строки) для текущей инструкции.
- renpy.log(msg)
Если
config.logне задана, ничего не делает. В противном случае, открывает лог-файл (если он еще не открыт), форматирует сообщение по ширинеconfig.log_widthи записывает его в лог-файл.
- renpy.unwatch(expr)
Прекращает отслеживание заданного Python-выражения.
- renpy.warp_to_line(warp_spec)
Принимает в качестве аргумента пару имя_файла:номер_строки и пытается перейти к инструкции перед указанной строкой.
Работает так же, как команда --warp.
- renpy.watch(expr)
Отслеживает заданное Python-выражение, отображая его в правом верхнем углу экрана.
Настройка лаунчера
Можно настроить лаунчер Ren'Py, чтобы выбрать файлы и каталоги, доступные для открытия по клику. Для этого создайте файл project.json со строками, приведёнными ниже:
{
"renpy_launcher":
{
"open_directory":
{
"game": "game",
"base": ".",
"images": "game/images",
"audio": "game/audio",
"gui": "game/gui"
},
"edit_file":
{
"script.rpy": "game/script.rpy",
"options.rpy": "game/options.rpy",
"gui.rpy": "game/gui.rpy",
"screens.rpy": "game/screens.rpy"
}
}
}
Если файл уже существует, вам нужно будет добавить в него ключ renpy_launcher и строки ниже. Затем вы можете редактировать словари, чтобы изменить доступные файлы и каталоги.