Визуальная новелла Memorandum на движке Ren’Py

Нолики и единички… Откройте игровой файл и погрузитесь в бездонные чертоги человеческого разума, будто бы программно проецируемого в огромный яркий и живой мир, затягивающий в себя и размывающий границы и различия между действительностью и фантастическим внутренним миром. Сможете ли вы решить, что для вас – настоящая реальность?

Демоверсия одной из сцен (50 секунд)

История проекта

Все началось с желания попробовать себя в качестве разработчиков игр. Один из участников команды сочиняет и пишет тексты, другие знакомы с различными средствами программирования игр. Выбор в конечном итоге пал на движок Ren’Py, спроектированный непосредственно для создания игр жанра визуальная новелла. Еще до начала летней практики были опробованы средства движка и созданы простые демоверсии игр.

Затем было решено разработать уже полноценную новеллу в течение летней практики. В этот момент нам очень повезло: наш преподаватель Борис Николаевич когда-то придумал концепт целой истории и рисовал к ней картинки и анимацию. Желая, наконец, доработать свою большую идею, он согласился объединиться с нами в команду и возглавить проект.

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

Это очень помогло координировать выполнение задач и успевать по дедлайнам. Сценарист начал писать текст, программисты – строить каркас игры, состоящий из наложенного текста и изображений на сцену.

Проходили дни, совещания… В команду вошли еще два художка, был готов сценарий для одной из глав игры, программисты, казалось бы, изучили возможности движка и поняли его принципы. Однако началась летняя практика, и нас начали поджимать сроки. На тот момент у нас был лишь пустой скелет и черновой вариант главного экрана (справа вы можете увидеть главный экран на момент защиты проекта, его анимированная версия доступна в видео по ссылке в конце раздела):

Сцена из скелета выглядела следующим образом:

Также появилась идея создать необычный экран загрузки с выбором или сохраненной игры, или определенной главы с начала. В конце невероятно длинной линии ошибок и неопределенного поведения программы, разработчики смогли разобраться в проблеме и наладить механику работы этого экрана (однако, с несчастным экраном не все так просто и по сей день: осталась одна неопознанная ошибка, из-за которой после загрузки с главы не работает обработка клавиши Escape). Справа приведен экран на момент защиты:

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

Итак, программисты получили материал – несколько картинок, видео и текст. Теперь мы поняли, что многого не знали о движке, так как при компоновке всего материала нам пришлось изучать взаимодействие трех основных концепций в Ren’Py: системы экранов, построения сцен, а также функции языка Python. За достаточно короткое время, в которое плотина с неспешно текущими коммитами в git словно обрушилась, мы смогли объединить видео со сценами в переходах, добавить экран с выбором в сцену, обновить экран загрузки, дополнительно изменив слоты, сделать главный экран анимированным. Результат: демоверсия одной из глав, которую, впрочем, мы наконец можем «почувствовать».

Описание проекта

Описание структуры и логического взаимодействия

Общий процесс работы над проектом – создание и поиск материалов и последующая их компоновка в игре с добавлением эффектов. Непосредственно команде по практике предстояло (и предстоит) написание текста и программирование. Программисты также учились изменять интерфейс пользователя, который по умолчанию предоставляет Ren’Py. Здесь представлена схема работы команды над главой и планы на подготовку к релизу игры.

Схема проекта

И если материалами можно было обмениваться с помощью веб-сервисов, то передавать версии игры было проблематично. Именно в этом проекте мы изучили технологию Git и наконец освоили ее на практике.

Описание программной части

Язык Ren’Py расширяет язык Python, с которым участники команды прежде никогда напрямую не сталкивались. Несмотря на то, что ни один из нас и сейчас не напишет хоть немного приличной программы на нем, все же расширение Ren’Py мы освоили и привыкли к синтаксису и системе. Система представляет из себя архитектуру классов, которая поддерживает две концепции: экранов и сцен.

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

Затем экран был анимирован, и этот оператор стал неподходить ввиду того, что конфликтовал с нестатическими объектами. В итоге анимированный элемент был добавлен на фон с помощью оператора add, а кнопки наложены сверху через средство fixed.

Логика экрана загрузки немного сложнее. Он статичен, и поэтому мы обошлись imagemap, однако идея заключалась в том, чтобы возможность загружать главы появлялась по мере прохождения игры:

Тут необходимо было разобраться в системе сохранения результата, который Ren’Py представлял самостоятельно. Мы изучили способы сохранения прогресса с использованием «постоянных» данных и их взаимодействие с обычным прогрессом текущего прохождения, а также возможность экранов считывать эти данные для корректного отображения пройденных глав. В итоге в начале каждой главы текущее прохождение сравнивается с общим и фиксируется, затем экран отображает его.

Здесь проверка экраном прохождений закомментирована, так как в демоверсии мы временно исключили эту технологию.

Некоторые кнопки (hotspot) со скриншота вызвают событие Jump(). Это прямой переход с экранов в само действие игры, то есть в сцены. Каждая сцена имеет свою метку (label), и, в отличии от экранов, позволяет размещать в себе иные операторы, добавляя различные способы переходов.

Здесь можно увидеть разные переходы в секции define, трансформацию текста на экране, объявление экрана выбора, а также начало сцены (главы в целом) с сохранением результата, проигрыванием видео и вызовом экрана выбора.

Заключение, послесловие, благодарности

Летняя практика позволила нам научиться планировать задачи, показала важность выполнения их в срок. Благодаря ей мы изучили игровой движок, освоили разные технологии для работы в команде и продвинули действительно большой проект.

Мы хотим поблагодарить нашего главного художника и лидера проекта Бориса Николаевича Седова за его идею истории Меморандума, все художественные материалы и координирование работы команды!

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

Ссылки

  • Возможно кто-то заинтересуется движком Ren’Py, добро пожаловать на страницы документации: https://www.renpy.org/doc/html/
  • Еще одна ссылка на видео готовой части проекта: https://youtu.be/4q8bygQjNTI

Команда проекта

Непосредственно члены команды, создавшие демоверсию:

  • Борис Седов – автор идеи истории, главный художник, лидер проекта
  • Павел Черемшагин – главный программист
  • Павел Матвиюк – программист
  • Сергей Персов – сценарист, тестировщик
Previous Article
Next Article