Разбор кода проекта с 3D-графикой и играми на ESP8266

Источник
Как я заставил ESP8266 рисовать 3 D, стрелять и летать: полный технический разбор кода

В статье представлен технический анализ программного кода проекта, разработанного на C++ для платформы Arduino IDE. Весь проект реализован в одном файле и включает пять игр, управление которыми осуществляется через конечный автомат. Особое внимание уделено оптимизации рендеринга на слабом железе ESP8266, где для создания 3D-эффекта используется алгоритм DDA (Digital Differential Analyzer). Вместо отрисовки полигонов система пускает 320 лучей из точки игрока, проверяя их пересечение с сеткой карты размером 32x32, хранящейся в массиве uint8_t объемом 1 КБ. Для повышения производительности при ограниченной скорости передачи данных по SPI отрисовка 320 вертикальных линий заменена на рисование 160 линий с растяжением каждого на два пикселя, что удваивает FPS при минимальной потере качества изображения.

Математическая часть движка включает расчет углов обзора и шагов луча для определения расстояния до стен. Для устранения эффекта рыбьего глаза применяется коррекция перпендикулярного расстояния до стены. Текстурирование стен достигается расчетом дробной части координаты попадания луча, что создает иллюзию текстуры без использования тяжелых спрайтов. Освещением управляет функция, раскладывающая 16-битный цвет на компоненты RGB, умножающая их на коэффициент затухания в зависимости от расстояния и собирающая обратно. Звезды и элементы интерфейса (HUD) отрисовываются с учетом высоты стен, чтобы не просвечивать сквозь них, а сам интерфейс выводится в самом конце цикла для предотвращения перекрытия.

В разделе коллизий автор описывает решение проблемы застревания игрока в стенах. Вместо проверки текущей клетки, алгоритм проверяет следующую позицию по осям X и Y отдельно, что позволяет персонажу скользить вдоль препятствий. В игре Space Invaders реализовано движение врагов зигзагом с изменением направления при достижении краев экрана, а также система бонусов и антибонусов с вероятностью 20%. Боссы появляются на каждом третьем уровне, их щупальца анимируются с помощью синусоиды от времени, а при смерти воспроизводится эффект концентрических кругов и звуков.

Третья игра, Space Junker, основана на физике инерции в вакууме. Скорость корабля изменяется только при нажатии на тягу, после чего движение продолжается по инерции с ограничением максимальной скорости. Космический корабль телепортируется с одного края экрана на другой при выходе за пределы. Стрельба автоматизируется через таймер, исключающий использование блокирующих функций задержки. Астероиды при попадании пули не исчезают, а делятся на два меньших осколка с увеличенной скоростью. Игра не заканчивается при уничтожении всех объектов, а автоматически генерирует новую волну. В конце статьи приводится полный исходный код проекта, демонстрирующий структуры данных, генерацию карты и логику всех описанных механик.

Текст подготовлен нейросетью Loople по материалам источника.

Читайте также

Похожие новости

Поиск по Loople

Назад