Инди Nick Feofentov
756

О маленьком и гордом кораблике в ночи и победе в номинации Mood на Ludum Dare 42

Недавно завершился 42-ой Ludum Dare. Так вышло, что наша игра заняла 1-ое место в категории Mood (Настроение). Рассказываем о хитростях разработки атмосферного приключения за 72 часа.

В закладки
Наш кораблик дошёл до своей цели

О Ludum Dare подробно написано в этой статье. Но чтобы далеко не ходить, повторимся: Ludum Dare - один из старейших и самых известных в мире гейм джемов, участники которого должны сделать игру на заданную тему за отведённый срок (48 или 72 часа в зависимости от формата участия).

Часть первая, в которой наша команда собирается

Этой весной ребята из Kyiv Indies Meetup организовали в атмосферном хабе оффлайновый джем с блек-джеком и пиццей, приуроченный к Ludum Dare 41. Там наша нынешняя команда и сформировалась, состоящая из Николая в роли программиста, геймдизайнера Лены и художницы Насти.

Темой было Combine 2 Incompatible Genres, то есть “Соединить два несовместимых жанра”. Мы выбрали спортивный симулятор и топ-даун шутер. В итоге, родился Zomball, который особого успеха не снискал, был несбалансированным и откровенно сырым, но подарил нам опыт и желание продолжать.

{ "items": [{"title":"\u0417\u0430\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u0442\u0435\u0440","image":{"type":"image","data":{"uuid":"2011928d-5d67-f0da-3e0e-108a71981672","width":1277,"height":720,"size":295361,"type":"jpg","color":"8a5f48","external_service":[]}}},{"title":"\u0413\u0435\u0439\u043c\u043f\u043b\u0435\u0439: \u043c\u044f\u0447 \u043d\u0443\u0436\u043d\u043e \u043a\u0438\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u043b\u044c\u0446\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0447\u043a\u0438, \u0438 \u0432 \u0437\u043e\u043c\u0431\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0443\u0431\u0438\u0432\u0430\u0442\u044c","image":{"type":"image","data":{"uuid":"f1126e4f-eac7-17c6-e5c0-9d49e28b46f9","width":1297,"height":728,"size":178824,"type":"jpg","color":"70502a","external_service":[]}}}] }

Уже на 42-ой Ludum Dare наша команда собралась тем же составом. Если в случае с Zomball-ом это было “больше, цветнее, мы их порвём”, то в этот раз решили не распылять свои силы и сконцентрироваться на чём-то одном. Мы стремились создать что-то простое, понятное и настроенческое. Более того, расслабленное и даже медитативное. Настя как раз проходила курс по 3D моделированию, и само собой подразумевалось, что игра будет в 3D.

Перед началом джема сформировался шорт-лист из 16 тем. Три из них были так или иначе связаны со светом. Идея о маленьком, но очень гордом кораблике, что идёт сквозь морскую пучину к маяку, в ходе брейн-шторма подплыла от нашего геймдизайнера Лены.

В голове живо представилась картина: маленькое судно в непроглядной темноте прокладывает свой путь среди высоких волн и опасностей к тусклому огоньку вдалеке. Эта концепция идеально ложилась на наши личные цели: простой геймплей в 3D и работа с туманом/освещением.

К сожалению, темой джема стала Running out of space. Мы стали перебирать подходящие концепции, но ни к одной из них не лежала душа. И тогда мы пошли на отчаянный шаг: натянули тему на то, что на самом деле хочется сделать.

К счастью, организаторы Ludum Dare даже в правилах указывают, что следовать теме не обязательно. Закономерно, самую низкую оценку - 582-ое место - игра получила в категории Theme

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

Решение было принято, и мы приступили к разработке.

Часть вторая, в которой мы делаем игру

В качестве визуального стиля выбрали low-poly для простоты работы с текстурами и цветом (лайфхак: тебе не придется рисовать текстуры, если в твоей игре их нет). Единственная текстура - воды - была найдена на просторах интернета и так удачно подошла, что менять её мы уже не решились.

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

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

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

Настя
художница

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

Результат работы первого дня

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

Чтобы создать иллюзию движения, вода подстраивает функции волн с учетом положения относительно начала координат, а текстура воды постоянно смещается в нужную сторону. С этим связан и главный баг игры: скорость волн зависит от скорости корабля, с чем еще предстоит разобраться. A smooth sea never made a skilled sailor.

Так мы выбирали цвет света будки. Остановились на тёплом и ламповом

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

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

Особое внимание было уделено шейдеру тумана.

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

Николай
программист

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

Маяк здорового человека/маяк курильщика

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

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

Результат работы второго дня

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

Часть третья, в которой мы ничего не успеваем

Помните сказку про Алису в Стране Чудес? Кажется, мы тоже прогневали время и отныне у нас всегда полчаса до дедлайна. Ничего не работает, Николай пытается не дать кораблю утонуть, Настя в волнах делает постер для пока ещё безымянной игры. В целом, всё как всегда. Где-то в это время родилось название, такое же простое, как и сама игра. Маяк. Lighthouse.

Щупальца в самой игре, возможно, появятся позже, но постер это уже проспойлерил

Когда пришло время собирать билд, оказалось, что хитроумный шейдер в сборке не работает, и маяк всё равно не видно в тумане. Кто бы мог подумать, что в нашем идеальном мире такое случается. Поэтому вот главный совет (на оригинальность не претендуем, зато он выстрадан лично): регулярно собирайте билды. Иногда то, что вы видите в редакторе, не имеет никакого отношения к действительности.

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

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

На голосование отводится две недели. Выставлять оценки могут только другие участники джема, а играть и комментировать - все желающие. Оценки выставляются в восьми категориях: Overall, Fun, Innovation, Theme, Graphics, Audio, Humor и Mood. Некоторые категории можно исключить из оценки своей игры. Мы, например, убрали Audio, потому что музыка не была написана специально для джема, и Humor, потому что в игре нет ничего смешного.

Этой гифкой мы привлекали внимание

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

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

Самая крутая вещь, которая сопровождает Ludum Dare - стримеры. Да, это не самые популярные люди на Twitch, но нет ничего более ценного, чем наблюдать за тем, как живые люди играют в твою игру. Нет, правда, осознавать, что стримят не только Fortnite, но и твою маленькую игру - просто бесценно.

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

И вот, спустя две недели голосование завершилось. Утром мы первым делом зашли на сайт Ludum Dare, чтобы увидеть наши результаты, и были ошарашены. Lighthouse заняла первое место в категории Mood. Той самой, в которую мы изначально метили с нашим курсом на атмосферность. По общей оценке она оказалась на 65-ом месте, а по графике - на почетном 128-ом.

Заветный золотой кубок на обложке игры

Часть четвертая, в которой подводятся итоги

Если вы ждёте, что в конце будет обязательная пачка советов от нас, то держите:

  • Если хотите участвовать в джеме - участвуйте. Забейте на другие советы и гайды, просто попробуйте. После первой попытки сразу станет понятно, по душе вам это или нет.
  • Начинайте делать билды задолго до окончания срока сдачи. Игроки не оценят вашего гениального геймдизайнерского решения, если не смогут в это поиграть.

Что будет дальше с игрой?

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

Благодарим за внимание всех, кто дочитал, и до встречи на будущих джемах!

С любовью, ваша команда маленького, но гордого кораблика из Lighthouse.

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Nick Feofentov", "author_type": "self", "tags": [], "comments": 1, "likes": 35, "favorites": 16, "is_advertisement": false, "subsite_label": "indie", "id": 26612, "is_wide": false }
{ "id": 26612, "author_id": 24224, "diff_limit": 1000, "urls": {"diff":"\/comments\/26612\/get","add":"\/comments\/26612\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/26612"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64960 }

1 комментарий 1 комм.

Популярные

По порядку

3

Вполне заслуженное первое место! Игра отличная!

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Пять простых способов разогнать свой ПК
с помощью соли и чайной ложки
Подписаться на push-уведомления