С++ : консольная бродилка - шутер от первого лица #1

00:00 Введение и цель проекта • Автор решает создать серию обучающих видео по работе с графикой на консоли. • Цель — собрать сложный движок для работы с графикой, используя ASCII-символы. • Демонстрация примитивного движка для шутера от первого лица: перемещение и поворот персонажа, движение по карте. 00:58 Начало разработки • Создание нового консольного проекта «confp». • Начало с базовой функции int main. 01:39 Проблемы вывода на консоль • Вывод данных на консоль медленный и с задержкой. • Необходимость доступа к буферу консоли для ускорения вывода. 02:24 Настройка консоли • Настройка размеров экрана: ширина 120 столбцов, высота 40 строк. • Создание двумерного массива для экрана. • Получение доступа к консоли с помощью функции create console screen buffer. 03:23 Вывод текста на консоль • Использование функции write console output character для вывода текста. • Указание координат для вывода текста в верхнем левом углу. 04:16 Игровой цикл и данные игрока • Использование чисел с плавающей запятой для хранения координат игрока. • Сохранение угла поворота игрока. 05:10 Создание карты • Карта представлена двумерным массивом: решётка для стен, точка для пустого пространства. • Использование типа Wstring для работы с Unicode. 05:55 Вдохновение и алгоритм рендеринга • Вдохновение от игры Wolfenstein 3D. • Описание алгоритма рендеринга: вычисление расстояний до стен для каждого столбца экрана. 10:01 Вычисление расстояний до стен • Проверка луча с небольшим шагом для вычисления расстояния до стены. • Использование единичного вектора для определения направления взгляда игрока. 12:11 Проверка границ карты • Установка максимального расстояния для проверки. • Проверка каждой ячейки на карте для определения стены. 13:03 Имитация перспективы • Вычисление высоты потолка и пола в зависимости от расстояния до стены. • Создание иллюзии перспективы путём изменения высоты потолка и пола. 13:55 Определение границ пола, потолка и стен • Звёзды на ночном небе кажутся неподвижными из-за бесконечности расстояния. • Пол является зеркальным отражением потолка. • Определены границы пола, потолка и стен для рисования в столбце. 14:24 Закрашивание элементов массива • Если y меньше максимального значения n, ячейка закрашивается как часть потолка. • Небо закрашивается как пустое пространство. • Стена обозначается символом решётки. • Пол закрашивается как пустое пространство. 15:43 Настройка консоли и управление персонажем • Перемещение игрока в центр комнаты. • Настройка свойств консоли: шрифт Consolus, размер окна 120x40. • Добавление элементов управления для поворота персонажа. 16:51 Реализация поворота персонажа • Использование функции getAsync key state для управления поворотом. • Поворот против часовой стрелки при нажатии клавиши A. • Проблема с кривой анимацией из-за высокой частоты кадров. 18:15 Решение проблемы с частотой кадров • Использование фреймворка Chrono для измерения времени между кадрами. • Корректировка скорости движения персонажа на основе времени. • Улучшение плавности движения. 19:20 Затенение стен в зависимости от расстояния • Изменение символа затенения стен в зависимости от расстояния до них. • Использование расширенных символов Юникода для затенения. • Пример использования символов для светлого, среднего и тёмного затенения. 20:38 Добавление движения вперёд и назад • Реализация движения персонажа вперёд и назад с помощью клавиш W и S. • Проверка работы затенения при движении. 22:04 Создание трёхмерной перспективы • Добавление дополнительных элементов на карту для лучшего понимания перспективы. • Наблюдение за изменением затенения блоков и стен. 23:33 Затемнение пола • Затемнение пола равномерно с изменением интенсивности по мере удаления от камеры. • Использование символов для затемнения пола. 24:52 Обнаружение столкновений • Добавление обнаружения столкновений при движении вперёд и назад. • Проверка координат игрока на карте для обнаружения столкновений. • Отмена действия при столкновении со стеной. 25:57 Добавление границ • Определение выхода за границы карты при трассировке лучей. • Добавление флага для отслеживания границ. • Усложнение задачи для определения границ. 27:00 Определение границ ячеек • Границы ячеек определяются по краям, без информации о полигонах. • Карта содержит два значения: 0 и 1, где 0 — стена, 1 — нет. • Ячейки одинакового размера, игрок смотрит на стену. 27:56 Расчёт для каждого луча • Для каждого луча выполняется отдельный расчёт. • Необходимо определить, попал ли луч в угол блока. 28:16 Определение расстояния до стены • Луч испускается от игрока, определяется пересечение с объектом. • По пересечению вычисляются координаты ячейки. • Проводятся линии от каждого угла ячейки до игрока. 28:55 Вычисление углов и границ 30:43 Сортировка вектора углов 32:40 Проверка углов и отображение границ 34:02 Настройка отображения границ 35:57 Добавление карты и статистики 37:16 Тестирование частоты кадров 37:54 Заключение и перспективы

Иконка канала Ленинский Букварь
240 подписчиков
12+
11 просмотров
3 дня назад
12+
11 просмотров
3 дня назад

00:00 Введение и цель проекта • Автор решает создать серию обучающих видео по работе с графикой на консоли. • Цель — собрать сложный движок для работы с графикой, используя ASCII-символы. • Демонстрация примитивного движка для шутера от первого лица: перемещение и поворот персонажа, движение по карте. 00:58 Начало разработки • Создание нового консольного проекта «confp». • Начало с базовой функции int main. 01:39 Проблемы вывода на консоль • Вывод данных на консоль медленный и с задержкой. • Необходимость доступа к буферу консоли для ускорения вывода. 02:24 Настройка консоли • Настройка размеров экрана: ширина 120 столбцов, высота 40 строк. • Создание двумерного массива для экрана. • Получение доступа к консоли с помощью функции create console screen buffer. 03:23 Вывод текста на консоль • Использование функции write console output character для вывода текста. • Указание координат для вывода текста в верхнем левом углу. 04:16 Игровой цикл и данные игрока • Использование чисел с плавающей запятой для хранения координат игрока. • Сохранение угла поворота игрока. 05:10 Создание карты • Карта представлена двумерным массивом: решётка для стен, точка для пустого пространства. • Использование типа Wstring для работы с Unicode. 05:55 Вдохновение и алгоритм рендеринга • Вдохновение от игры Wolfenstein 3D. • Описание алгоритма рендеринга: вычисление расстояний до стен для каждого столбца экрана. 10:01 Вычисление расстояний до стен • Проверка луча с небольшим шагом для вычисления расстояния до стены. • Использование единичного вектора для определения направления взгляда игрока. 12:11 Проверка границ карты • Установка максимального расстояния для проверки. • Проверка каждой ячейки на карте для определения стены. 13:03 Имитация перспективы • Вычисление высоты потолка и пола в зависимости от расстояния до стены. • Создание иллюзии перспективы путём изменения высоты потолка и пола. 13:55 Определение границ пола, потолка и стен • Звёзды на ночном небе кажутся неподвижными из-за бесконечности расстояния. • Пол является зеркальным отражением потолка. • Определены границы пола, потолка и стен для рисования в столбце. 14:24 Закрашивание элементов массива • Если y меньше максимального значения n, ячейка закрашивается как часть потолка. • Небо закрашивается как пустое пространство. • Стена обозначается символом решётки. • Пол закрашивается как пустое пространство. 15:43 Настройка консоли и управление персонажем • Перемещение игрока в центр комнаты. • Настройка свойств консоли: шрифт Consolus, размер окна 120x40. • Добавление элементов управления для поворота персонажа. 16:51 Реализация поворота персонажа • Использование функции getAsync key state для управления поворотом. • Поворот против часовой стрелки при нажатии клавиши A. • Проблема с кривой анимацией из-за высокой частоты кадров. 18:15 Решение проблемы с частотой кадров • Использование фреймворка Chrono для измерения времени между кадрами. • Корректировка скорости движения персонажа на основе времени. • Улучшение плавности движения. 19:20 Затенение стен в зависимости от расстояния • Изменение символа затенения стен в зависимости от расстояния до них. • Использование расширенных символов Юникода для затенения. • Пример использования символов для светлого, среднего и тёмного затенения. 20:38 Добавление движения вперёд и назад • Реализация движения персонажа вперёд и назад с помощью клавиш W и S. • Проверка работы затенения при движении. 22:04 Создание трёхмерной перспективы • Добавление дополнительных элементов на карту для лучшего понимания перспективы. • Наблюдение за изменением затенения блоков и стен. 23:33 Затемнение пола • Затемнение пола равномерно с изменением интенсивности по мере удаления от камеры. • Использование символов для затемнения пола. 24:52 Обнаружение столкновений • Добавление обнаружения столкновений при движении вперёд и назад. • Проверка координат игрока на карте для обнаружения столкновений. • Отмена действия при столкновении со стеной. 25:57 Добавление границ • Определение выхода за границы карты при трассировке лучей. • Добавление флага для отслеживания границ. • Усложнение задачи для определения границ. 27:00 Определение границ ячеек • Границы ячеек определяются по краям, без информации о полигонах. • Карта содержит два значения: 0 и 1, где 0 — стена, 1 — нет. • Ячейки одинакового размера, игрок смотрит на стену. 27:56 Расчёт для каждого луча • Для каждого луча выполняется отдельный расчёт. • Необходимо определить, попал ли луч в угол блока. 28:16 Определение расстояния до стены • Луч испускается от игрока, определяется пересечение с объектом. • По пересечению вычисляются координаты ячейки. • Проводятся линии от каждого угла ячейки до игрока. 28:55 Вычисление углов и границ 30:43 Сортировка вектора углов 32:40 Проверка углов и отображение границ 34:02 Настройка отображения границ 35:57 Добавление карты и статистики 37:16 Тестирование частоты кадров 37:54 Заключение и перспективы

, чтобы оставлять комментарии