Мои маленькие достижения в Monogame

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

Тут я учился делать физику песка

Все началось с архитектуры. Поскольку все, что дает вам Monogame (он же Microsoft XNA), это вывод спрайтов на экран и некоторые математические библиотеки (например, для работы с векторами и точками, и те, на мой взгляд, сделаны не достаточно хорошо), \поправка: речь про инструменты для той задачи, которую я выполнял\ я занялся разработкой фреймворка по привычной мне и многим структуре Entity Component System с, соответственно, сущностями, компонентами и сценами. Такая архитектура позволила мне перескакивать с разработки одного компонента сразу к другому, поэтому я постоянно решал все новые и уникальные задачи, совсем не скучая и не рискуя перегореть.

На видео изображена типичная физика с песка с одним главным отличием от большинства остальных подобных проектов: я реализовал динамическое скрепление пикселей (это видно, когда они становятся красным объектом). Я уделял огромное внимание оптимизации (на сколько только зватало моих знаний, совсем не жалея времени), поэтому мой средний компьютер с Ryzen 4300U еще удерживал на своих плечах около пяти тысяч таких пикселей (каждый со своими физическими параметрами).

Данный проект должен был перерасти в файтинг с управлением элементами. Бойцы могли бы вырывать землю из под ног на карте или замораживать воду, а потом кидать все это или расстреливать оппонента. В один момент я начал осознавать, что, если по части программирования, геймдизайна и в принципе игровой логике у меня проблем не возникнет (я студент техникума, у меня достаточно свободного времени и пока что я могу не думать о том, что не зарабатываю деньги), то вот графику я реализовать никак не смогу, потому что мои навыки в сфере рисования абсолютно нулевые. Да и амбиции я поднял такие, что проект опять затянется не менее чем на МНОГО, поэтому я немного впал в апатию, а через пару дней отчаяния приступил к элементарной, но очень легко-реализуемой и годной для моего уровня гиперказуалке.

Я случайно сказал, что она легко-реализуема? Ну, если не учесть то, что для отрисовки полигонов в нужном мне виде мне пришлось изучать некоторые математические концепции дополнительно. Например, для закраски полигонов шейдером я проверял, находится ли точка внутри всех граней полигона, используя скалярное умножение, находя нормали и делая некоторые другие непотребства. Мы живем в отличное время и все необходимое для отрисовки полигонов я нашел в интернете, но предварительно я успел сдаться пару раз в 4 часа ночи, пытаясь допереть до этого самому или найти более простое решение, которое мог позволить форм-фактор движка. Также в XNA есть возможность рисовать полигоны из текстур, но я предпочел делать это вручную в привычной мне системе измерений и без матриц, в которые я пока не хочу залезать без необходимости. Наверняка я еще пожалею о своем решении. Зато изучил, как работают и как писать шейдеры, что тоже очень круто.

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

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

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

130
46 комментариев