Изнанка. Дневник разработки #5
Постановка проблемы
Сегодня начал разбираться с тем, как показывать игрока, когда он уходит за стены, с этим столкнулись многие игроки на джеме, да и сам я прекрасно знал, что рано или поздно придётся с этим разобраться. Проблема классическая: если просто ничего не делать, игрок «пропадает» за стеной, и играющий теряет ощущение контроля. Сегодня будет короткий девлог как раз на эту тему, устраивайтесь удобнее.
Мысли, мысли и ещё раз мысли!
У нас тайловая карта, и раньше я думал про рейкасты на каждый кадр, но это быстро станет проблемой для быстрой работы. Нужно решение, которое:
- работает быстро;
- хорошо смотрится в пиксель‑арте;
- даёт чёткую обратную связь.
Была идея сделать механику как в Project Zomboid или SIMS , где части тайлов целиком становятся прозрачными (такой некий дизеринг, только крупнее) , просто рисовать силует игрока за стеной. Но потом я подумал, а почему бы не создать простенький шейдер , который позволит нарисовать круг в центре игрока и заставить этот круг вырезать кусок слоя из тайла. Так и пришла идея работать в этом направлении.
Проход 1. Подводные камни
Изначально я пошёл самым очевидным путём — использовать экранные координаты в шейдере. Круг действительно появлялся вокруг игрока, но стоило изменить масштаб камеры или разрешение окна, как отверстие начинало смещаться. Всё работало нестабильно и требовало постоянного пересчёта координат. Стало понятно, что такой подход не подходит для проекта.
В итоге я полностью изменил архитектуру эффекта. Вместо экранных координат шейдер теперь использует мировые координаты тайлов и самого игрока.
Фактически шейдер работает непосредственно в пространстве игрового мира.
Проход 2. Матрица Байера
Передний слой стены больше не рисуется автоматически движком. Вместо этого он отрисовывается вручную через шейдер, который определяет расстояние до игрока и создаёт отверстие нужного размера. Мне не хотелось использовать обычную полупрозрачность. Она плохо смотрится в пиксельной графике и делает изображение немного "мыльным". Поэтому вместо изменения альфа-канала используется дизеринг и этот метод очень подходит пиксельным играм.
Внутри определённого радиуса стена полностью исчезает, а по краям появляется пиксельное растворение с помощью матрицы Байера. Получается эффект, который больше напоминает старые консольные игры и отлично сочетается с общим стилем проекта.
Честно говоря, эта задача оказалась намного интереснее, чем я ожидал. Иногда кажется, что делаешь "обычную прозрачность стены", а в итоге приходится полностью пересматривать подход к работе шейдеров и координат. Но именно такие небольшие системы постепенно делают игру более приятной и удобной для игрока, к этому я и стремлюсь.


Комментарии (0)
Войдите, чтобы написать комментарий
Войти