История создания визуальной новеллы

Приветствую вас, многоуважаемый читатель.

С вами на связи разработчик, желающий поделиться собственным опытом создания визуальной новеллы Curiosity/Любопытство (далее в тексте ВН). Учтя опыт других подобных рассказов, я постараюсь рассмотреть, как можно подробнее все этапы, начиная от идеи и заканчивая выпуском игры. Помимо всего прочего, я постараюсь предоставить максимум информации о сюжете игры, избегая при этом любых возможных спойлеров.

Устраивайтесь поудобнее и приятного чтения.

Первый этап. Идея.

Что такое идея? Википедия определяет идею, в общем, как мысленный прообраз чего-то, а в конкретном случае произведения, как главную мысль. И действительно, идея – это то, с чего начинается игра, то ради чего всё затевается. Она может прийти спонтанно, возникнув на пустом месте, а может появиться, когда вас вдохновит нечто, что вам понравится.

В моём случае, источником вдохновения послужил короткий рассказ “Один вечер одной жизни”.

Этот рассказ так сильно зацепил меня, что мой разум тут же начал придумывать чёрному коту (главному герою рассказа) предысторию. Его прошлую жизнь. Родственников. Как он погиб. И т.д.

Примерно в то же время, я закончил проходить ВН “Planetarian: Chiisana Hoshi no Yume”. Поскольку я уже тогда увлекался программированием, то желание сделать свою игру объединилось с придуманным сюжетом и, под влиянием Planetarian, преобразовалось в желание создать собственную визуальную новеллу.

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

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

Ну и поскольку главным героем игры был кот, я решил, что будет неплохо попытаться показать то, как он смотрит на мир. Взглянуть на всё с его точки зрения.

Второй этап. Сюжет игры.

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

Шаг за шагом, моя задумка приобрела более конкретную форму. Осталась лишь та часть, которую мне, по моему мнению, было по силам расписать самостоятельно.

Задумки, представленные в предыдущем этапе, превратились в нечто более определённое.

Целью главного героя стало узнать, кем он был в прошлой жизни.

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

Что касается того, как именно главный герой достигнет этой цели, что будет ждать его на пути и чего он достигнет в результате, а также возможных выборов и того каким же образом игра будет “давить” на эмоции игрока … пусть это будет сюрпризом для тех, кто решит пройти игру :3

А мы движемся дальше.

Третий этап. Сценарий.

Этот шаг был первым ощутимым препятствием. Весь описанный сюжет требовалось превратить в текст, который будет интересно читать. Это была не самая простая задача, решить которую, на тот момент, мне помог опыт “словесных ролевых игр” (для тех, кто считает, что там один разврат и порно, есть отдельный котёл в аду). Отдельно хотелось бы отметить тех соигроков, которые требуют минимальной грамотности соигрока и “посты” 10+ строк. Именно такие требования заставляли развиваться меня как писателя. И именно благодаря подобному опыту, я смог вести повествование от лица кота. Первоначально, я разумеется столкнулся с проблемой чистого листа. И решением данной проблемы, для меня, стало написание постов самому себе. Я мысленно отыгрывал роль кота из придуманного сюжета, записывая соответствующий пост и это оказалось на удивление эффективным. После небольшого редактирования, я получил повествование от первого лица, которое уже можно было спокойно использовать в игре. А сверх того, я получил ценный опыт о том, как я могу решить проблему чистого листа (хотя это применимо лишь в случаях, когда нужно писать рассказ от чьего-то лица).

Четвёртый этап. Программирование.

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

Само собой, в процессе, я успел пройтись по разным движкам, конструкторам и языкам программирования. И, в конце концов, было принято решение использовать для создания ВН язык java. Основная причина – возможность писать код сразу и на ПК, и под мобильную версию игры.

Сейчас уже сложно вспомнить, почему я не захотел пользоваться готовым движком. Причин было много, но одной из них явно было желание сделать эту часть самостоятельно. Программирование было тем, с чего я начал погружение в создание игр. И я не смог перебороть странное желание реализовать всё полностью самостоятельно, без чужих движков.

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

Те, кто играл в визуальные новеллы, наверняка знают, что текст в них, обычно выводится не сразу, а по букве, с некоторой скоростью, которую можно менять. В этой части тоже всё достаточно просто, создаём отдельный поток, в котором очищаем элемент с текстом, а затем в цикле, по букве выводим новый текст. Что касается скорости этого вывода, то для её регулирования используется базовая функция sleep позволяющая так сказать поставить выполнение кода на паузу, на некоторое время. Именно из-за неё и используется отдельные поток, иначе вся игра просто зависла бы. Ну, для тех, кто разбирается в программирование это и так очевидно.

Продолжаем. Как я уже говорил, в самой игре нет ничего сложного. Сейв/Лоад и сохранение настроек реализуем через запись/чтение текстовых файлов. И вуаля, игра готова.

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

ПК и Steam.

Любой, кто использует язык отличный от C/C++, пожелав подключить к своей игре Steam столкнётся с тем, что официально steam sdk есть лишь для C++. Всё остальное – неофициальные сборки различных сообществ и энтузиастов. Было там и неофициальное решение для java, но … я не имел ни малейшего желания встраивать в проект не официальную библиотеку и вникать в её тонкости. Можно было бы вообще отказаться от steam sdk. Он моей игре особо и не требовался … если бы не одно весомое НО! Достижения. Выпустить в steam визуальную новеллу, с несколькими концовками и секретами, да без достижений … с подобным я смириться не мог.

В итоге, моим решением данной проблемы стало использование JNI. Если очень коротко, то это способ прикрутить C++ код к java. Фактически для этого требуется: IDE – я использовал Code Blocks.

Компилятор – в моём случае MinGW.

Установленная сборка java. Без этого никак.

Ход решения задачи следующий.

Создаём новый проект, выбираем тип dll (Dynamic Link Library) – то есть библиотека, которую мы сможем подключить к нашей java игре.

У нас появятся два файла h – заголовочный файл и cpp файл. Собственно, в первом объявляются названия функций, а во втором реализуется код выполняемый ими.

В заголовочном файле подключаем jni.h из установленной нами java. И объявляем функции. Любая функция объявленная в данном файле, должна иметь вид “названиепакета_названиекласса_названиефункции” и содержать две обязательные переменные (JNIEnv *, jobject). С названием пакета в java, я думаю всё и так ясно, а название класса – это, собственно, имя того класса, через который вы будете загружать dll. Переменные объявлять обязательно, но сами они вам вряд ли понадобятся. Разве что, JNIEnv пригодится, если вы будете передавать строки туда и обратно, поскольку требуется решать проблемы с разницей кодировок, но тут хватит всего двух функций GetStringUTFChars и NewStringUTF.

Теперь возвращаемся к cpp файлу. Подключаем steam_api.lib и/или steam_api64.lib и реализуем нужные нам функции steam api.

Компилируем dll, переносим его в папку нашего проекта (и steam_api.dll/steam_api64.dll туда же) и загружаем в класс, с объявленными внутри функциями (те же названия, что мы давали в h файле, но уже без имени класса и пакета, только имена функций и без двух обязательных переменных).

Примеров как пользоваться jni в интернете хватает, так что главное не забыть положить dll Стима в ту же папку, что и созданный нами, чтобы всё заработало.

Итак, что требуется сделать после того, как закончена работа над java программой? Правильно, превратить скомпилированный jar файл в привычный exe. Ну и избавить конечного пользователя от необходимости устанавливать java для запуска нашей игры. Решений существует множество … и ни одно мне не подошло. Я работаю в IDE NetBeans и для сборки исполняемого файла хотел использовать Inno или Wix, но столкнулся с рядом проблем. И как только я решал одну из них, тут же всплывала другая. Достаточно сказать, что первой же проблемой будет использовать конкретные и устаревшие версии, потому что с ними есть хоть какая-то надежда собрать результат и то, не факт, что рабочий (это касается именно сборки приложения в NetBeans).

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

Быстрый поиск по гуглу сразу выдал мне причину, почему игру ошибочно считают вирусом. Тот самый Launch4j. Вникать дальше я не стал, так как в обнаруженных обсуждениях ясно дали понять, что нужно искать другой выход. Отказавшись от Launch4j, я наконец пришёл к единственному решению, которое следовало бы сделать уже давно, но я всё равно раз за разом откладывал его. Я знал, что java файл можно запустить и самому. Для этого нужно лишь запустить саму java и подать в неё соответствующие консольные команды. Когда я наконец нашёл их в поисковике, всё оказалось на удивление просто. Я открыл тот же CodeBlocks и собрал exe файл, который выполнял команду system(“jre/bin/java – jar ‘путь к jar файлу игры’ ”).

Jre – это средство запуска java файлов, благодаря которому пользователю не придётся самому скачивать и устанавливать java на своё компьютер. Я и так таскал его с собой, в своём проекте, так что мне было достаточно добавить скомпилированный exe в папку игры, как всё заработало. Проблема была решена.

Android и Google Play.

К моему удивлению, здесь всё оказалось даже сложнее, чем в пк версии. Если для подключения к Steam, достаточно было добавить в игру нужную библиотеку да вызвать нужную функцию, то в Google Play всё было гораздо сложнее.

Потребуется зайти в Google Cloud Platform и заполнить OAuth consent screen.

В том же Google Cloud Platform, потребуется создать реквизиты для входа. А для их создания, необходимо достать sha1 ключей которыми вы подписываете приложение (и для тестовой, и для релизной версии).

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

Ну и наконец, самое сладкое. Создать лицензионное соглашение, в котором вы подробно объясните зачем вам личные данные пользователей (да я просто хочу давать им ачивки, за что так сложно Google?!).

На этом программирование заканчивается.

Пятый этап. Звуковое сопровождение.

Звук – одна из тех вещей, которые, наряду с фоновыми изображениями добавляют игре атмосферности. Музыкант из меня никакой, поэтому тут я позволил себе прибегнуть к заимствованию. Благо хорошей музыки и звуков с CC0 (Creative Commons 0 – без авторских прав) в интернете более чем достаточно. Так что мне не составило труда найти подходящие треки. Единственное что, это отняло порядочно времени.

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

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

Шестой этап. Фоны.

Ох, это отдельный вид боли. На момент начала работы над игрой художник из меня был не лучше, чем музыкант. Ну, оно и ожидаемо, в художественную школу не ходил, ни с кем не занимался, а ИЗО из школы сводилось к “нарисуйте вот это” без какого-либо внятного обучения, а как рисовать вообще и вот это в частности. Ну, максимум может один раз упомянули, что тело человека это 7 голов и всё.

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

Но, даже если такие люди и находились, они быстро уходили, в лучшем случае нарисовав один фон. А меня это не устраивало. Я хотел, чтобы все фоны были нарисованы одним человеком в едином стиле.

Шли годы, я окончил школу и близилась к окончанию учёба в университете. За это время, я успел продвинуться во многих других областях, поднакопить знаний и даже начал писать свой 3D движок на java+JOGL (спасибо туториалам с habr), но ситуация с художником не менялось.

У меня поднакопилась некоторая стипендия и я решил попытаться найти художника уже за деньги. И снова облажался. Художники с тем уровнем качества и стилем, который я хотел видеть в своей игре, требовали очень много денег за каждую работу. А я был готов платить максимум 1500 за фон. И то, это было проблемой. И вот, наконец, я нашёл художника, который посмотрев на ТЗ, согласился делать фоны за приемлемую сумму.

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

В тот момент, я сорвался. Я был очень зол. Я хотел доделать свою игру любой ценой. А ещё, вновь всплыло моё, вроде бы поутихшее желание и думаю в этот момент, заказывая графический планшет с aliexpress, я вполне походил на Таноса.

История создания визуальной новеллы

Но, чтобы нарисовать фоны, недостаточно было купить планшет. Те из вас, кто сталкивался с ситуацией, меня поймут. Когда в школе тебе не объясняли какой-то предмет, а лишь ставили тройки, и все вокруг смиренно кивали головами, мол “ну нет таланта в этом, зато другое умеешь”. Отвратительная ситуация. В мозгу напрочь укореняется, что вот конкретно это для тебя невозможно. Вот так у меня было с рисованием. И перешагнуть через это, даже с учётом своего упрямства и того что я был “на эмоциях”, мне бы не удалось … если бы не две решающие вещи. Первой стало то, что я нашёл подходящие туториалы. Это были туториалы от “Школа цифрового рисунка | Pixel”. Сразу оговорюсь – это не реклама их школы. Я никому их не советую и не предлагаю. Я не покупал их курсы обучения. Я учился по бесплатным туториалам, в видеозаписях из их группы в ВК. И мне они помогли, только благодаря второму решающему фактору. А именно – той самой упомянутой ранее работе над своим 3D движком. Ибо именно благодаря ней я понял базовые принципы перспективы и как меняется тон предмета в зависимости от угла, на который под ним падает свет. А уж, после того как сам записывал матрицы перспективы и шейдеры, рассчитывающие освещение в своём движке, понять о чём идёт речь в бесплатных туториалах и научиться по ним базовым основам перспективы, тона, текстуры и т.д. было не так уж и сложно. В общем, в том, что их курсы будут полезны кому-то ещё я не уверен, так что тут на меня не смотрите.

А вот и некоторые из результатов моих трудов. Остальное можно посмотреть в группе в ВК (ссылка в конце поста).

Седьмой этап. Релиз.

Собственно, игра готова, что же дальше? Само собой, её нужно выложить на соответствующих площадках (благо они уже мной выбраны заранее).

В google play никаких проблем с тем чтобы зарегистрироваться как разработчик. Оплати 25$ да выкладывай себе игры. Тем более, что у меня уже был аккаунт разработчика, поскольку ранее я выпускал там одно приложение и мне требовалось лишь выложить игру. А теперь нужно лишь дождаться, пока моя игра пройдёт проверку (что-то они с ней затягивают, пишут, что из-за Covid, ну да я подожду.)

В Steam регистрация немного сложнее. За каждую игру придётся заплатить 100$, ну да это общеизвестный факт, как и заполнение w8ben. Благо, мне не пришлось заполнять её самому, ибо теперь там достаточно пройти опрос, по результатам которого, они сами заполнят все поля. Подпиши – да отправляй.

Этапов проверки в Steam 2. Оба я прошёл со второй попытки. На первом проверяют как вы заполнили страницу магазина. Ничего сложного, но я проглядел по невнимательности, что на почти всех изображениях, должно быть название игры, так что пришлось исправлять. На втором этапе, проверяют уже саму игру. Самое главное, чтобы она запускалась. Загрузив первую сборку в стим, я допустил идиотскую ошибку, из-за которой моя программа не запускалась на других компьютерах. Но, это и к счастью. Ведь, из-за другой ошибки, некоторые антивирусы считали мою игру вирусом, и я смог поправить это досадное недоразумение. (Для пропустивших четвёртый этап – именно там рассказывается о причинах, по которым моя программа воспринималась как вирус и о том, как я решил эту проблему.)

Итог, проверки в Steam пройдены, а проверки в google play ещё нет, но скоро уже должны тоже быть завершены.

Страница в google play появится только в день релиза, а в Steam уже доступна.

Дата релиза запланирована на 12.04.2021

Восьмой этап. Пиар.

И вот, мы добрались до последней, но не менее важной части. Именно на этом этапе, я нахожусь сейчас.

Читая чужие рассказы о выпуске своей игры, советы и т.д. я неоднократно слышал, что “пиар нужно начинать задолго до выхода игры”. И я даже пытался. Но, с текстом и музыкой, без фонов, особо никого не привлечь. Максимум, что я смог сделать – создать группу в вк, в которой до сих пор никого особо нет, да сделать визуальной новелле страничку на anivisual.

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

Почти вся информация, которую я нашёл в интернете полна абстрактных советов, без какой-либо конкретики.

Всё, что мне удалось подчерпнуть, так это советы отправить ключи от игры стриммерам/ютуберам, что проходят игры соответствующего жанра, да выкладывать информацию о своей игре везде, где только можно. Собственно, это ещё одна причина создания данного поста, помимо простого желания поделиться ходом создания собственной визуально новеллы. Эх, пойду дальше гуглить, как пиарить свою игру.

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

2727
17 комментариев

Лично мне стало интересно, что в итоге получилось, все же немало сил было вложено, а это как минимум заслуживает внимания. Автору уже респект за старания. Посмотрим, что будет на релизе, желаю успехов! 😉

2
Ответить

Благодарю! Надеюсь, когда игра выйдет, она придётся вам по нраву)

2
Ответить

Статье не хватает картинок и форматирования, но я всё равно люблю читать статьи про вхождение в индустрию! Хоть и не программист, с интересом прочёл и эту часть (и рассказ про кота по ссылке), вообще хочу похвалить за максимально подробный материал. Так как сейчас учусь на 2д артиста (так как хочется тоже войти в индустрию и, как мне тоже показалось, наиболее проще это сделать через визуальную новеллу, но так как я не программист, то пока решил подучится арту для привлечения внимания к проекту), то автоматом при чтении прожил много неловкости, связанной с первыми набросками и творческими заданиями.

Ну, собственно, как пиарить - опыта нет, но как мне кажется, если будешь писать ещё или публиковать эту статью на других ресурсах - поработай над оформлением, картинками, заголовками, цветовым выделением, также в текст можно вставить трейлер игры. Хотя скажу, что во многом текст привлёк лично моё внимание именно потому, что не было никакого оформления, то таких задротов как я немного. Как написали в комментариях ниже - плохо, что нет персонажей. Думаю, что неплохо бы было нарисовать кота (мне как раз недавно приходилось вымучивать котиков для одного задания и мне кажется вы бы тоже справились за несколько минут) или его силуэт и добавить на главный/ключевой арт, причём желательно бы было сделать это и на странице в Стиме (насколько я понимаю - там возможно вносить правки и после релиза, но сейчас это особенно важно для привлечения внимания). Таким образом основная картинка с логотипом оживёт и будет на визуальном уровне сообщать что-то потенциальному игроку. Я понимаю, что все любят котиков и это дешёвый трюк, но если вы сами говорите, что в самой игре пытались давить на чувства, то и манипуляция с котиком не повредит :) Добавил проект в вишлист, удачи!

2
Ответить

Благодарю! Рад, что статья вас заинтересовала.
Старался сделать всю статью, как можно более подробной, так как часто видел, что других авторов подобных статей упрекают за недостаток информации.
Желаю вам удачи и успехов в вашем начинании. На мой личный взгляд, обучившись арту вы пройдёте как минимум треть пути к собственной ВК.
Я обязательно учту необходимость более красивого оформления, в следующий раз.
Что касается силуэта кота, он есть, хотя мне почему-то не пришло на ум вставить его в статью. Этот силуэт используется как иконка для моей игры, с самого начала привлекая к себе внимание)

2
Ответить

Не знаю почему, но у меня сейчас словосочетание "визуальная новелла" вызывает рвотные позывы, прямо как русский пнк-квест в нулевые.

2
Ответить

так это один и тот же жанр "я ничего не могу но хочу сделать игру" 

1
Ответить

Я искренне надеялся что сценарий игры пишешь не ты... Хотя бы текст кому нибудь дай почитать. 

1
Ответить