Space Invaders «с нуля» — Часть 1, создаём окно
Старт серии по созданию клона Space Invaders на C++: настраиваем окно и контекст OpenGL 3.3 с GLFW и GLEW, собираем проект и запускаем первый «красный» кадр.
258 открытий3К показов
Это перевод статьи автора Nick Tasios.
Автор написал клон классической аркады Space Invaders на C++, опираясь всего на пару зависимостей. В этой части мы подготовим окно и контекст OpenGL 3.3, используя GLFW и GLEW — это единственные внешние библиотеки, которые понадобятся на старте.
Что такое Space Invaders
Space Invaders — аркадная игра 1978 года. Это 2D-шутер с горизонтальным управлением: игрок двигает пушку вдоль нижней границы экрана и стреляет по строю инопланетян. За каждого сбитого врага начисляются очки. Периодически по верхней части экрана пролетает НЛО — если сбить, получите бонусные очки. По мере уничтожения инопланетян игра ускоряется. Враги тоже стреляют случайно, приближаясь к низу экрана; попадание по игроку отнимает жизнь. Пушку частично прикрывают бункеры, но они постепенно разрушаются как под выстрелами врагов, так и самим игроком. После зачистки волны появляется новая, а бункеры восстанавливаются. Игра заканчивается, если бункеры полностью разрушены, инопланетяне достигли низа экрана или у игрока закончились жизни.
Постановка целей
Важно определить цели до начала проекта. Мы не собираемся дотошно воссоздавать оригинал — сделаем «space-invaders-like» прототип с базовыми элементами. В геймдеве обычно сначала собирают «грубый» прототип, чтобы проверить ядро механик, а «полировать» будем позже.
В прототипе нужны:
- управляемая игроком пушка;
- волны инопланетян, которые постепенно движутся к пушке;
- стрельба у обеих сторон.
НЛО и бункеры на первом этапе опустим (их несложно добавить потом).
Почти любую игру можно разложить на базовые элементы (очень советую доклад Raph Koster). В Space Invaders это движение и стрельба (а значит — детекция столкновений). Даже простой клон поможет прокачать понимание геймлупа, коллизий и правил игры.
Поехали!
Hello Window
Окно можно создать по-разному: нативные API (Cocoa/X11/WinAPI) или кроссплатформенные библиотеки (Qt, GLFW). Нативный путь даёт полный контроль, но ради простоты и кроссплатформенности возьмём GLFW: лёгкая, простая C-API.
Подключим заголовки (стандартный ввод/вывод и GLFW):
Это откроет окно 640×480 с заголовком Space Invaders и контекстом OpenGL. Два последних параметра glfwCreateWindow — монитор для фуллскрина и «шаринг» контекста между окнами. При неудаче вызываем glfwTerminate(). Важно: нужно «привязать» контекст текущему потоку (glfwMakeContextCurrent), чтобы последующие вызовы OpenGL применялись к нему.
По умолчанию версия контекста не гарантируется — попросим минимум 3.3 Core (задать до создания окна):
Почему нужен загрузчик функций OpenGL. OpenGL — это спецификация; реализация зависит от GPU/драйвера/ОС. Множество функций нужно загружать в рантайме. Делать это вручную неудобно, поэтому используют лоадеры. Здесь — GLEW (можно и GLAD, но в статье выбран GLEW).
Важно: подключаем GLEW до glfw3.h:
Игровой цикл (Game loop)
Если запустить код сейчас, окно мигнёт и программа завершится. Нужен бесконечный game loop, где мы обрабатываем ввод, обновляем состояние и рисуем кадр:
- Буферы. Современный OpenGL рисует в «задний» буфер, а «передний» отображается на экране.
glfwSwapBuffers()меняет их местами. - События.
glfwPollEvents()вынимает накопившиеся события (клавиатура, мышь, закрытие окна). - Выход.
glfwWindowShouldClose()станет true, если пользователь нажал «крестик».
В конце корректно освобождаем ресурсы:
Компиляция
Ниже — команды из оригинала (C++11), плюс современные примечания.
Обратите внимание, что позже мы будем использовать некоторые функции C++11, поэтому компилируем с помощью -std=c++11. В обоих случаях убедитесь, что у вас установлен GLFW 3. В Linux, в зависимости от вашего дистрибутива, вы можете использовать менеджер пакетов. Например, в Ubuntu GLFW можно установить с помощью следующей команды:
На Mac OS X автор предпочитает использовать Homebrew:
Возможно, эта статья поможет вам настроить проект GLFW в Visual Studio.
Если всё собрано успешно, вы увидите красное окно с заголовком Space Invaders.
Итоги
Даже просто «поднять окно» с контекстом OpenGL на C++ — задача не из быстрых, несмотря на помощь GLFW. Мы пока ничего не рисуем; настройка простейшего рендера в современном OpenGL тоже требует подготовки. Хорошая новость — делать это придётся один раз, а дальше вы переиспользуете базу в следующих частях (шейдеры, VBO/VAO, спрайты, коллизии и т. д.).
Вторая часть статьи — здесь
258 открытий3К показов








