Рисование Бумажного подземелья или "как это было"
Гаминатор прошёл и по своей весьма условной традиции пытаюсь выкатить пост о том как же всё делалось. В силу моей плохой памяти многое может быть не совсем то, чем каже.. чем запомнилось.
Внимание: много картинок!
Читать много слов и истории из глаз разработчика прямо в продолжении поста!
До Гаминатора
Кажется, у меня как раз было желание сделать какую-нибудь игру, чтобы хоба и игра готова, вернее 2-3 недели было бы как раз. И тут анонсируют конкурс — удачное совпадение!
И опять же совпадение — как раз была (и заканчивалась?) скидка на GameMaker: Studio 2. Был сложный выбор между покупкой UWP версии для некоторых целей, но немного изучив это, взвесив все за-и-против (или же бросив кубик D6 ?!) — решил взять стандартную версию для Win\Lin\Mac.
Все совпадения случайны, но заодно это участие проверило кое-какую игро-идею, если не забуду — напишу какую именно в конце\итогах.
Анонс и тема
Конечно меня сразу понесло делать игру без темы, потому что нужна была какая-то основа. Сундук-мимик Анима86 сразу конечно навеял мысли о подземельях и вот этом всём.
Решил я взять код из режима Вояжора Пистона, а как оказалось — выдрать было очень сложно, много проникающих друг в друга кодовых основ и всего прочего. Так что случилось как со Взертосом, который был основан на Ludum Dare-овских Орках — пришлось всё переписывать практически с нуля, но хоть с какой-то основой.
Играние с темой конечно было забавным. Ожидаешь что-то, но то, что кажется очевидным — слишком очевидно! Очень поугадовали тему и на самом Гамине и в Телеграмм чате, но конечно самое эффектное угадывание было для меня в очень-локальном-ТГ-чате:
22 сентября, ДД (т.е. ДаркДес) случайно попал точно в цель. Фото в цвете.
Неожиданный поворот. Особенно для меня.
Во время работы над игрой в том чате обсуждение Гаминатора было минимальным или не очень. Ну как минимум про свою игру я там не писал особо.
Собственно по пси-полям удалось предсказать две вещи — тему Гаминатора и то, что случилось с моим (не)могуществом.
Ручку в руки через руку или пошла жара
Очень много и часто показывал свой прогресс в ТГ-чате Гамина, скриншоты там, гифки. Муки выбора и прочее.
Первым шагом (после покупки ГМС2 конечно) стал перенос некоторых механик и кода из Вояжора.
Конвертация проектов и\или импорт расширений(а именно так я решил перенести Подземелья) из ГМС1 в ГМС2 на удивление работают очень хорошо.
Ради теста я так же попробовал конвертнуть целого Взертоса с ГМС1 на ГМС2. И знаете что? Кажется всё работает умеренно идеально. Т.е. если учесть достаточно кривой код, баги и вот это всё — Взертос даже запустился и немного поигрался. После небольшой модификации конечно (но это проблемы выпиливания одной функции из ГМС1 наверно).
Конечно конвертировать проекты я бы не стал больше. «Обёртки» над старыми функциями выглядит как куча мусора и хлама + создаются всякие странные около-хаки с глубиной, ведь в ГМС2 теперь это работает иначе.
Например, вот скриншот конвертации и первого запуска Подземелья:
Собственно и по сей день (05.11.2018) в проекте Бумажного куча кода от Подземелья, который конечно же не используется.
Вообще от того самого Подземелья осталось очень не много, многое было переделано, переписано, пере-что-нибудь-потому-что-это-ГМС2.
А вот это по сути уже именно подземелье бумажное:
Не знаю когда точно, но кажется ещё до начала работы над «прототипом» сформировалась идея, что графически всё это должно быть нарисовано на бумаге, а затем сканером прогнано. По итогу конечно получился немного не такой эффект, но кажется даже интереснее — это было бумажное пиксельное 3д на гейммейкере, Карл!
Что там дальше чем 3д?
Когда-то давно начинал систему инвентаря писать, чтоб как в Диябло — grid-based инвентарь, на ГМС1. Ключевой момент конечно в том, что «начал», но было готово примерно 80% всей такой системы.
Тут можно заметить самый базовый инвентарь. Как видно — полезный щит был с самого начала.
Добавив хоть какой-то инвентарь и частичную его работу я ВНЕЗАПНО ударился в написание шейдера. Начало было примерно такое:
Забавный факт: подобный шейдер изначально я хотел написать для тестов визуального стиль для некоторого проекта на букву V. Но тогда у меня на тестовом полигоне в виде картинки (а не 3д сцены) ничего не получилось.
Есть некоторая гифка, где есть изображение неправильной версии этого шейдера, но мне показалось это забавным:
А это просто интересное цветное подземелье:
И примерно где-то здесь заканчиваются «секретные» скриншоты, дальше визуальное развитие относительно минимально — разве что инвентарь и интерфейс менялись, а так, всё осталось, шейдеры, например:
Но вот пара забавных багов:
Ещё вот тут «чернильная тень» интересно выглядела:
Генерируй!
Вспоминал как генерировать подземелья по BSP, но в итоге пришлось подгонять реализацию снова. Уже третий раз наверно пишу, но повторение — это этсамое.
Не без проблем конечно, но по итогу стало более-менее нормально и стабильно.
Затем ещё добавил генерацию по старому принципу (из Вояжора-Подземелий), которую в скриптах назвал snake, но настоящее название не знаю. Суть генерации «змейкой» в том, что берётся N попыток и каждую попытку в ячейку записывается «проходимость» и случайно выбирается направление следующего движения.
Было и вот такое:
И даже такое:
И не без этого конечно:
Собственно скриншотов разработки так много, потому что я люблю скриншотить этапы разработки (не всегда хотя получается) и поэтому этот пост скорее хронология скриншотов — моя память слишком плохая, чтобы в деталях описать мои решения и деяния в процессе создания игры.
Почему вот-такой-вот сюжетный поворот, а не другой? А где тема Гаминатора? Да вот же она! Как не видно!?
Например, баго-фича с поеданием всего и вся в своём оригинале действительно была багой, но я решил, что это слишком крутой момент и оставил это именно как особенность игрового процесса. Новый уровень менеджмента героя и его инвентаря, если хотите (не хотите).
Нелогичность некоторых вещей «игровой логики» — тоже по сути вырастали из чего-то вроде багов или нелогичных. Почему курица воскрешает игрока после смерти? Простопотомучто!
А щит? Почему он не защищает? А ловкость? Разум? Что вообще!? Ну во всех же играх работает и важно, почему же здесь нет? Мне кажется, что ... .
Ошибка, которая действительно оказалась сильной ошибкой (тут не знаю — логической?), что баланс оказался сломан в край. Ну и с восстановкой ХП конечно тоже. Как-то с успеванием участия забылась логика генерации и в итоге в коде прописалась логика для «0.1» добавления, а в БД предметов оказалась логика «1.1» множителя.
Немного итогов
Специальный раздел: 3д функции в GMS2
Кажется, меня попросили чуть подробнее о 3д в ГМС2. Но думаю этот подраздел будет о общих впечатлениях о ГМС2.
Собственно визуально-то всё прикольно, но иногда было такое, что:
Или например:
Но чаще конечно вот это:
И конечно «Не отвечает» на ровном месте. Но это может показаться, что на ровном месте, на самом деле думаю закономерность была — чаще всего при сборке игры в exe\zip.
***
И так, про само 3д. ГМС2 от ГМС1 в этом плане сильно отличается. Многие функции убрали, другие переименовали, третьи ... так сказать, дополнились — матрицы.
Все функции d3d_* и даже удобные d3d_model_* реализации которых всё равно были скрыты и работали непонятно как, но ПРОСТО — тоже убрали.
Теперь трансформации работают на matrix_*, что вроде как у больших взрослых дядь, но конечно нет ни функции обратной матрицы, ни транспонирования даже.
Другие функции хоть и обновили, но всё равно не достаточно. Не знаю, «наследие» ли это, но в дебагере до сих пор есть строчка про Stencil buffer, доступ к которому ни ГМС1, ни ГМС2 не даёт. Вопрос тогда — зачем?
Но теперь можно хоть поставить функцию-константу на тест глубины — уже шаг в будущее ... или прошлое? Хм. А шейдеры так и не могут писать в float — по итогу изображений у нас обычный A8R8G8B8.
(На правах попытки объяснить за матрицы по просьбе:)
Не преподаватель из ВУЗа я, а кому-то и в школах говорят матрицы преподносят.
Иногда это кажется сложно, но думаю даже не очень программистам или математикам это становится понятнее, если оперировать этим как операцией\функцией.
Скажем, вот есть куб в 3д. По сути и всё. Ничего не видно. Чтобы что-то узреть — нужно настроить матрицу проекции. Но и этого будет недостаточно — нужна ещё и матрица вида.
Вершина 3д модели проходит примерно такое преобразование:
итоговая_вершина = вершина_модели * матрица_мировая * матрица_вида * матрица_проекции.
Порядок перемножения очень важен, но этого вот эту «формулу» не нужно делать самому — ГМС уже так делает сам. Главное задать матрицы в каждый «слот».
Мировая матрица — это по сути трансформация конкретной модели для отрисовки. Нужно, чтобы модель чайника крутилась по оси Z в зависимости от времени? Строите матрицу поворота по Z и готово!
Нужна более сложная трансформация? Опять же — порядок очень важен.
Если сначала сместить модель, затем повернуть, то поворот будет относительно 0,0,0 точки.
Поэтому нужно сначала повернуть на нужные углы (если повороты нужны относительно центра модели), затем если нужно — использовать масштаб, а под конец — смещение.
Матрица вида — это камера. Кстати о камерах — в ГМС2 теперь завезли их «из коробки», лично я думаю, что это плюс, хоть и чуть сложнее стало. Но в каждой своей игре я всё равно делал объект «камера» и несколько скриптов к ней. Однако, это камеры 2Д (хотя можно и для 3д, но ->) однако они не заточены для 3д. Т.е. есть функция установки позиции, но ... только для 2д. Спрашивается — зачем тогда?
Матрица проекции — сравнимо с правилом искажения. Т.е. именно эта матрица делает 3д таким 3д, к которому привыкли. Чтобы в дали объекты были меньше, а у носа игрока — размером с экран. Искажение по X\Y, чтобы на широкоформатных мониторах картинка не растягивалась. Так же может быть не только перспективная проекция (3д), но и ортогональная(2д игры), при этом последняя — может быть и в 3д! В 3д графических редакторах например часто используется 3д ортогональная проекция (хотя по факту это именно просто ортогональная — «3д-шность» ей даёт матрица вида, которая изображает точку наблюдения и взгляда в 3д пространстве).
Специальный раздел: обновлённая версия Бумажного Подземелья
Собственно ничего особенного, просто новая забагованная версия подземелья, там есть новые штуки.
Как минимум теперь там есть лук и стрелы! Сундуки теперь показывают пустые ли они (если не зелёный, то пустой), подходя к предмету на полу можно узнать что за предмет, например.
Конечно есть ещё что добавить, доработать и изменить. Даже с Котом по этому поводу перекинулись парой тысяч томов в чате.
Так что возможно будет и ещё одна версия, а может и пару — надо смотреть.
По поводу начала поста — о игро-идее. Давно думал о жанре данжен кроулеров, да оказывается у меня планов на игры в этом жанре наверно больше, чем шутеров. И вот одна из последних оказалась для меня интересной. Конечно по наброскам в голове это не казалось чем-то очень сложным. Но именно благодаря Гаминатору и Коту его ведущему понял, насколько же было сложно реализовать тот данжен кроулер, если этот кое-как вывез (а этот сравним наверно прототипом передвижения, нежели чем-то похожим на тот данжен).
Специальный раздел: как это рисовалось
Как я указал в Ридми файле к игре — рисовалось это линером из Ашана. Тот момент когда фраза «берёшь@рисуешь» точно описывает графику для этой игры. Взял листочки в клеточку и рисовал там по каким-то своим правилам.
Но не всегда в клеточку. Вот это например тот самый бонусный рисунок за прохождение:
Ещё одновременно с Гаминатором проходил Inktober, в который я немного порисовал, а потом слился.
А вот это первый скан первых ассетов для игры:
Мне очень повезло, что 0int решил помочь с музыкой. Я бы точно не написал что-то хорошо, а что планировал — не успел бы. Но зато у меня было больше времени (примерно на 20 секунд) чтобы поработать над звуками!
Кажется, в Бумажном нет ни одного моего старого звука, а лишь новые записанные на старый смартфон.
Внезапно мне очень понравились звуки инвентаря и предметов. На втором месте звук открывания двери, а вот какой звук не получился совсем (но было уже поздно что-то менять) — это хождение.
Да, какое-то время просидел в Аудасити ещё, чтобы выбрать нужные. Было даже несколько «рейдов» на звуковые волны. Но самым урожайным был первый конечно — там кажется было 6 минут чего-то.
Открывание сундука это кстати открывание и закрытие ящика стола, например.
Открытие двери — это проход тем-самым-линером по кольцам тетради (не знаю как это называется).
Много звуков соударения кучи ручек\линеров — там почти всё пошло в ход звуков инвентаря.
Мне очень понравился этот Гаминатор. И моё же участие (ну ещё бы!), как случайно наткнулся на визуальный стиль, какие-то бага-фичи, понимание некоторых вещей для себя. А стримы? Очень полезно посмотреть как играют в игру, даже в ультра-забагованную. Короче было круто, как всегда!
Всем спасибо! Особенно тем, кто прочёл до конца.
СЛАВА РОБОТАМ!
- 05 ноября 2018, 20:00
- 032
Пост хороший. И игра годная, очень авторская! Можно сказать только одно - ДЕЛАЙТЕ
Ну я немножечко поделаю, а потом выделаю!
Это же готовый материал для хоррора. Если бы на меня в тёмном лесу пополз эдакий гигантский сундуко-змей, я бы помер на месте от страха.
Жаль, что этого зверя нужно было долго выслеживать в лесу. Кажется, нужна была ещё и верная фаза луны!
Первая встреча с внезапным ЛОНГМЭНОМ - тоже вполне себе хоррор
Лонгмэны помирают с нескольких тычков, что явно не идёт на пользу их хоррор-имиджу. То ли дело сундуко-змей -- догнав игрока, он выдавал бы бесконечное количество ошибок о несуществующем id выдаваемого предмета, после чего компьютер игрока просто уходил бы в BSOD и никогда из него не возвращался. Spooky.
оно ползет на меня, спасите-помогите.
Шейдер очень добротный получился. Всегда интересно за кулисы глянуть, спасибо. Мало кто так подробно рассказывает.
И все же на безлюдный остров возьмешь гмс1 или все-таки гмс2. Чет баговылеты меня насторожили. А стоит ли или подождать? В первогамаке то у меня вылет стабильно развполгода.
Шейдер долго писал, да - статья правда этого не показывает, но было долго.
Даже не знаю - гмс1 или гмс2. Приятнее как-то работать в гмс2, но есть моменты, которые хорошо бы остались как в гмс1, но их нет.
У меня гмс1 тоже ошибками всякими разными сыпал, чего только стоит "2.0 не число!". У ГМС2 кстати проблема внезапной потери прогресса проекта кажется минимальна - там всё на отдельных файлах.
каждый раз когда у меня уходил гмс2 в неответ, то я не терял прогресс совсем - разве что Воркспейс старый грузил.
Ты нашел, можно ли в гмс2 разделять код на разные кусочки внутри одного эвента, как это можно было делать в гмс1?
В гмс2 появилась штука под названием region - ставишь #region и #endregion и получается почти как в гмс1, но совсем не так конечно. Но можно убрать с глаз долой 10005000 строк кода и даже подписать какие-то моменты:
Если не знать, что это гамак, можно подумать, что это вижуалка
Ну они сделали новую базовую цветовую схему подсветки синтаксиса, да. Правда я пару моментов всё же изменил, как и в ГМС1 менял.
Наконец-то мне кто-то объяснил как это делать! Спасибо, друже. Теперь можно обратно на гмс2 перелезать.
Напомнило: https://twitter.com/crowsx3/status/1055132493505069056
А эти люди знают толк в необычном звуке!
Это один из создателей The Stanley Parable
https://twitter.com/crowsx3/status/1055476266890092544
Так и не играл, но много слышал
Разработка прямо в папке Яндекс-Диска это круто! :) Откройте для себя git, котаны.
Ещё немножко непонятно по поводу матриц. Это что, в гамаке чуть ли не руками нужно писать аффинные преобразования и всё такое?
Но зачем git, если можно не git?
У меня другие проекты есть на битбакете и каждый раз обновлять (даже используя bat-ник) - напрягает.
А вот "авто-заливка" - мне нормально.
Ну да, там можно заливать массив из 16-ти элементов в "слоты" матриц. На самом деле это даже в ГМС1 есть и я использовал такое.
Т.е. можно хоть своими руками собирать матрицу проекции, а не использовать ГМ-овскую функцию.
Жаль, что до "взрослых" матриц дошли, а до векторов - нет. Поэтому в ГМС1 писал набор скриптов для векторов в 3д.
Если я делаю какой-нибудь даже маленький проект без git (хотя бы локального) у меня возникает некомфортное чувство и тревога. Я - Гитозависимый.
Зачем git, если можно делать копии в zip-архивы и периодически сохранять их на флешку?
А потом последнюю версию архива выкладывать на dropbox в запароленном архиве?
git предназначен для совместной разработки когда файлы могут изменить без твоего ведома. Если все делаешь один - он не нужен.
Не уверен сарказм ли был твой ответ, но на всякий случай отвечу серьёзно. Плюсы использования гит, даже если работаешь один над проектом:
1. Иметь стройную историю коммитов полезно. Удобно откатываться, можно просто посмотреть, что ты там наделал когда-то. Наглядно видны изменения.
2. Использование удалённого репозитория даёт возможность всегда иметь доступ к коду с любого устройства. В bitbucket даже есть редактор. Не всем это нужно конечно.
3. Когда-нибудь в проект могут прийти новые люди и для них может быть полезна история коммитов.
4. Гораздо легче делать эксперименты, потому что можно быстро откатиться, или залить в другую ветвь.
Зачем на флешку, можно на дискетки. Или вообще пользоваться инновацией Windows XP под названием "Портфель".
Самое важное можно и в тетрадочку записать
На бересту или на папирус, коллега
Поиграл в постконкурсную версию (которую ты указал по ссылке "СКАЧАТЬ").
- Некоторые сундуки после открывания остаются с зеленой штриховкой, но предмет при этом мы не подбираем. Предмет остается после уничтожения такого сундука, но подобрать его нельзя. В отличие от просто выброшенных предметов из инвентаря.
Да, сундук имеет зелёный цвет теперь тогда, когда в нём что-то есть.
Хм, а вот что предмет после уничтожения нельзя подобрать - странно. Точно достаточно места в инвентаре?
Свободного места хоть куда, специально проверял.
Тогда надо будет поправить это дело. Пока тестил не встречал такого.
Пусть лучше если вещь из сундука не помещается в инвентарь, то мы ее берем в руку.
А там уже либо меняем местами с другой вещью в инвентаре, либо выбрасываем (или кладем обратно в сундук).
Хм. Т.е. брать вещь в слот, если слот пустой? Прикольная идея - надо будет посмотреть как впишется в мой говнокод.
брать вещь в курсор лучше
Хм, в смысле чтобы потом самому и назначить либо в слот, либо ... но что если места нет? Ну т.е. вот взял в курсор предмет, поставил в занятый слот, а предмет из слота уже не помещается в инвентаре? Логичнее было бы тогда их конечно по сути "сменить местами" (т.е. старый предмет в курсор).
Надо будет подумать, да. Но как бы это не было слишком усложнение во всей структуре.
жрёшь его или кладешь на землю
см грим рок)
Но у меня не ГримРок!
ИДЕАЛЬНО!
Ну просто думаю не очень корректно сравнивать такое. Да, моя поделка пытается походить на игры тех жанров, но это же "я художник я так вижу"! Скорее всего.
элементы интерфейса почти 1 в 1, по этому посмотреть что-бы не допустить их ошибок и не плодить своих... ну.. вай нот..)
предлагаю чтобы предмет брался в курсор как в гримроках и глазах бехолдера, только при этом пусть цветные человечки пляшут и пивом угощают. так и функционал удобный сохранится и ты будешь чувствовать что сохранил своё лицо и нашёл свой путь, не как у всех.
некоторые предметы хотят свободный слот 2х4, тут просто много места недостаточно