TDS: потс-мортем

Это перевод моего поста с итча, если вы хотите прочитать его в оригинале, вот ссылка.

4fwRyzi

Теперь, когда Девтобер закончился, пришло время подвести итоги. Если честно, во время самого Девтобера я особо ничего нового не узнал, не считая, возможно, следующих моментов:

  • Работать над игрой до часа ночи и просыпаться в 6:30 утра, чтобы идти на работу — это вполне реалистичный график.
  • Даже если у вас есть играбельная демка, не требующая установки, и вы постите обновления каждый день, всем все равно будет наплевать. Нужно либо прикладывать куда больше усилий для пиара, либо пилить что-то совершенно экстраординарное. Наверное. Я не проверял.

Однако, я многое узнал во время разработки вне Девтобера, которая началась еще в сентябре 2018-го, когда игра была просто движком на вебЖЛ. И да, этот пост также и постмортем для всей игры, так как я достиг той точки, когда даже мне не нравится, в каком направлении движется разработка. Почему — сейчас узнаете.

Что пошло не так:

  • Геймплей. Главная идея игры, помимо очевидного «убей их всех, не сдохни, купи новые пушки, ГОТО 0», заключалась в том, чтобы заставить игрока мыслить тактически, выбирая подходящее оружие для борьбы с каждым видом врагов. Но оказывается, когда враги прут со всех сторон, самое подходяще оружие — это то, которое наносит наибольший урон за наименьшее время. Звучит невероятно, верно ?! Хотя я думаю, что на самом деле я смог бы заставить это работать, если бы перебалансил оружие, снизил цены, сделал врагов жестче, а общий геймплей — медленнее, как, например, в Sunless Skies.
  • Наследование. Это главная причина, по которой я отказался от TDS, именно из-за этого архитектура игры скатилась в говно. Просто не используйте его, поверьте мне. Используйте компоненты.

Что пошло так:

  • Компоненты. Я их начал использовать при реализации различных видов пуль (например, пули, которые рикошетят от стен; пули, которые взрываются с осколками и т. д.), и сперва я делал их подклассами основного класса Bullet, пока не понял, что с подклассами скомбинировать эти виды не получится. После этого я перешел на компоненты (о чем я уже писал ранее) и к подклассам уже не возвращался.
  • Оружие. Я хотел гибкую систему, которая позволяла бы мне создавать всевозможные паттерны стрельбы, но я ничего не мог придумать, не считая того, что основной паттерн должен состоять из нескольких подпаттернов, которые, в свою очередь, уже состоят из пуль, содержа их положения, скорости, вариации в положении, вариации в длине скорости, вариации в угле скорости и т. д., но вводить все это вручную — это уж чересчур. Я загуглил «bullet hell pattern implementation», но ничего не нашел. Тогда я придумал класс-конструктор паттернов, использующий шаблоны «строитель» и «текучий интерфейс», который позволял бы пользователю добавлять новые пули в подпаттерны, трансформировать и копировать их. И оказалось, что такая система работает довольно неплохо, взгляните, например, на реализацию тяжелого пулемета, его паттерн состоит из трех подпаттернов, с 5 пулями в каждом, что означало бы, что мне пришлось бы вводить данные для 15 пуль, если бы я сделал это без класса-конструктора, и я даже не говорю о пушке босса-алмаза, стреляющей радугой, которая выпускает 72 пули с разными скоростями и цветами:

mVC2iac


Что пошло и так, и сяк:

  • Векторная графика. С одной стороны, ИМХО, она выглядит стильно, и очень похожа на графон из Geometry Wars и олдскульных игр, типа Asteroids или Tempest (чего я и добивался), но при отрисовке линии выходят пикселизованными, это — следствие рендеринга во фреймбуффер, что необходимо для использования эффектов пост-процессинга, типа bloom. Я взглянул на алгоритмы антиалиасинга, но они, похоже, скорее подходят для текстурированных поверхностей, что неудивительно, поскольку алгоритмы сглаживания линий (например, алгоритм Сяолиня Ву) просто рисуют плавные линии с самого начала.
  • Редактор. Мне пришлось запилить собственный редактор векторной графики, так как ни один из имеющихся мне толком не подходил, и это и правда оказалось куда лучше, чем вбивать координаты точек вручную, однако в нем было много недостатков, из-за которых мне все равно частенько приходилось редактировать полученный JSON вручную. Главная проблема, на мой взгляд, заключалась в том, что я решил использовать canvas для рисования фигур вместо SVG. С помощью SVG я мог легко использовать какой-нибудь MVVM-фреймворк и просто забиндить позиции точек к данным во вью-модели, и мне не пришлось бы заново перерисовывать канвас каждый раз, когда происходят какие-либо серьезные изменения.

uX3pUk9

  • Физика. Реализовать собственный физический движок — это то, что я всегда хотел сделать с тех пор, как решил стать разрабом (то есть, примерно с 2006-го года). И по большей части мне это удалось. Я представлял объекты в виде нескольких окружностей и использовал равномерную сетку для broad-phase. В общем, обнаружение коллизий было довольно тривиальным. А вот разрешение их было уже куда сложнее. Для этого мне нужно было бы найти те окружности, которые столкнулись первыми, и я не нашел эффективного способа это сделать, поэтому мне пришлось прибегнуть к костылю и вместо этого использовать хитбоксы, образованные окружностями, что было куда грубее, и периодически выглядело очень странно. В следующий раз я, наверное, просто возьму чужой движок.
  • Оказывается, разрабатывать движки веселее, чем разрабатывать игры! Да-да, это так!

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