Пример пользовательского интерфейса.
Пример скрытого пользовательского интерфейса.
Game of Life - это визуализация классической игры "Жизнь" Конвея с использованием OpenGL. Проект позволяет пользователям исследовать динамику клеточных автоматов в интерактивной среде, где вы можете вращать, перемещать камеру и взаимодействовать с клетками.
Данный проект расширяет классический клеточный автомат "Жизнь". Клетки существуют на сетке, где их жизнь или смерть в каждом поколении зависит от количества соседних клеток.
Чтобы скачать последнюю версию программы, нажмите на следующую ссылку:
Проект включает в себя:
- Визуализация: Отображение сетки и клеток в трёхмерном пространстве.
- Взаимодействие с пользователем: Управление симуляцией, движение камеры и изменение состояния клеток.
- Рендеринг OpenGL: Использование современных методов OpenGL для достижения высокой производительности.
- Интерфейс пользователя ImGui: Библиотека позволяет легко настраивать и изменять интерфейсы.
- Управление Паттернами: Добавлена возможность загрузки и размещения паттернов из файлов .cells через класс PatternManager, что упрощает добавление новых фигур в игру.
- Многотипные клетки:
- Игроки могут вручную размещать три основных типа клеток: зелёный (1), красный (2) и синий (3).
- При рождении новых клеток могут появляться дополнительные типы, зависящие от преобладания соседей:
- Жёлтый (4) — равенство зелёных и красных соседей.
- Оранжевый (5) — равенство зелёных и синих соседей.
- Фиолетовый (6) — равенство красных и синих соседей.
- Белый (7) — редкий тип, когда все три основных типа соседей равны (зелёный = красный = синий).
- Случайная генерация: Начальная расстановка клеток включает все 7 типов с равной вероятностью, что делает каждую игру уникальной.
- Начальное состояние: Игра начинается с начальной конфигурации клеток, где некоторые клетки живы, а другие мертвы.
- Соседство: Каждая клетка имеет восемь соседей (клетки, которые находятся непосредственно рядом, включая диагональные).
- Правила обновления: На каждом шаге (или поколении) состояние каждой клетки обновляется в соответствии с следующими правилами:
- Смерть от одиночества: Живая клетка умирает, если у нее меньше двух живых соседей.
- Смерть от перенаселенности: Живая клетка умирает, если у нее больше трех живых соседей.
- Выживание: Живая клетка остается живой, если у нее два или три живых соседа.
- Рождение: Мертвая клетка становится живой, если у нее ровно три живых соседа.
- Поколения: После применения правил ко всем клеткам, создается новое поколение, и процесс повторяется.
- 3D визуализация: Игра отображается в трехмерном пространстве, где клетки представлены на плоскости.
- Реализация на GPU: Для ускорения симуляции используется GPU через OpenGL Compute Shaders.
-
- Интерактивное управление:
- Навигация камеры: Используйте клавиши WSADQE для перемещения камеры.
- Изменение состояния клеток: Левая кнопка мыши позволяет переключать состояние клеток (живые/мертвые).
- Цветная клеточная сетка: Клетки могут иметь разные цвета в зависимости от их состояния и типа.
- Управление симуляцией:
- Запуск/остановка: Пробел для управления симуляцией.
- Пошаговое выполнение: Стрелки вправо для перехода к следующему поколению.
- Рандомизация сетки: Клавиша 'R' для случайного заполнения поля.
- Управление правилами: Реализована возможность динамически менять правила игры:
- Рождение: Количество живых соседей, необходимое для рождения новой клетки.
- Выживание: Минимальное и максимальное количество живых соседей, при котором клетка выживает.
- Перенаселение: Количество живых соседей, при котором клетка умирает от перенаселения.
- Интерфейс пользователя: Используется ImGui для создания пользовательского интерфейса:
- Управление симуляцией (старт, стоп, следующий шаг).
- Выбор и размещение паттернов (Glider, Blinker и т.д.).
- Настройка правил игры через комбобоксы.
- Сетка и визуализация:
- Возможность переключаться между отображением и скрытием сетки.
- Поддержка тороидального мира или ограниченного поля.
- Сохранение и загрузка: Механизмы для сохранения и загрузки состояния игры.
- Камера: Реализована навигация по 3D пространству с возможностью перемещения камеры.
- Пробел: Запуск/остановка симуляции.
- ENTER: Шаг вперёд.
- WSADQE: Перемещение камеры вперед, назад, влево, вправо, вверх, вниз.
- END: Повернуть паттерн в режиме вставки паттернов на 90градусов, клавишами со трелками отризить вертикально или горизонтально (FLIP).
- R: Случайное заполнение поля.
- T: Сброс камеры, чтобы весь игровой мир был виден.
- Y: Сменить тип мира (сетка с ограниченными краями или с тороидальными краями).
- I: Скопировать выделенную область как паттерн для вставки.
- P: Активировать режим вставки паттерна на игровое поле, ESCAPE деактивировать режим вставки паттернов.
- C: Очистка поля, убить все клетки.
- G: Спрятать или показать сетку.
- Колесико мыши: Масштабирование (зум). Чтобы увеличить скорость масштабирования, удерживайте левый Control (Ctrl).
- Правый клик и перетаскивание: Перемещение камеры.
- ЛКМ: Изменение состояния клетки под курсором.
- ЛКМ + SHIFT и перетаскивание: Выделить поле, после чего клавишами INSERT вставить в выделеное место живые клетки, на DELETE удалить живые клетки, ESCAPE снять выделение.
- СКМ (клик колесиком мыши): Добавить фигуру из предустановленных петтернов(шаблонов) или из выбранных файлов.
- Клавиши от 1 до 6 + CTRL: Выбор различных предустановленных паттернов для размещения на поле:
- 1: Глайдер
- 2: Мигалка (Blinker)
- 3: Живок (Toad)
- 4: Баржа (Beacon)
- 5: Маятник (Pentadecathlon)
- 6: Ружьё Госпера (Gosper Glider Gun)
- Клавиши от 1 до 7: Выбор Цвета и типа клетки:
- 1: синий (type = 1)
- 2: зелёный (type = 2)
- 3: голубой (type = 3)
- 4: красный (type = 4)
- 5: фиолетовый (type = 5)
- 6: жёлтый(type = 6)
- 7: белый(type = 7)
- Turbo Mode — это экспериментальный режим симуляции, который превращает вашу "Игру Жизни" в настоящий ускоритель частиц! В этом режиме мы выжимаем максимум из GPU, позволяя выполнять несколько шагов симуляции за один кадр рендеринга. Результат? Скорость симуляции взлетает до небес, но стабильность остаётся под вопросом.
- Как это работает?
- Включите Turbo Mode через кнопку в окне "Управление симуляцией" (ищите красную кнопку — её сложно пропустить!).
- Количество шагов симуляции за кадр (Simulation Steps) автоматически подстраивается в зависимости от текущего FPS, пытаясь удерживать рендеринг на частоте вашего монитора (по умолчанию 75 Гц).
- Чем больше шагов, тем быстрее эволюционирует ваша сетка — но и тем выше нагрузка на систему.
- Предупреждение: Экспериментальная зона!
- Стабильность: Этот режим нестабилен и зависит от размера сетки, мощности вашего GPU и настроек параметров. На больших сетках (например, 10000×10000) возможны просадки FPS, зависания или странные глюки — от "волн" в скорости симуляции до внезапных "турбо-скачков".
- По умолчанию: Режим выключен, и игра работает в стандартном стабильном режиме с одной симуляцией на кадр. Включайте Turbo Mode только если готовы к приключениям!
- Почему это круто?
- На маленьких сетках вы получите молниеносную симуляцию без потери FPS.
- На больших сетках это как тест на выносливость для вашего GPU — сможете ли вы укротить хаос?
- Как использовать?
- Откройте окно "Управление симуляцией".
- Найдите кнопку "Turbo Mode" (красная, как сигнал опасности).
- Нажмите её, чтобы включить/выключить режим.
- Наблюдайте, как ваша симуляция либо взлетает, либо эпично падает — зависит от удачи и настроек!
- Примечание: Мы не гарантируем, что ваша видеокарта не начнёт молить о пощаде, а игра — вести себя как космический корабль на автопилоте с пьяным штурманом. Это эксперимент, так что играйте с ним на свой риск и получайте удовольствие от хаоса!
Если скорость симуляции то возрастаяет то падает, и идут просадки ФПС, то необходимо увеличить задержку симуляции приблизительно на то число которое указано ниже слайдера так же можно поставить галочку в чекбокс автопилота который будет автоматически подстраивать задержку для выравнивания ФПС
Для настройки и запуска проекта:
-
Необходимые условия:
- Операционная система Windows
- Visual Studio версии не ниже 2022 с инструментами для разработки на C++
- Библиотеки и заголовочные файлы OpenGL. GL.h glu.h opengl32.lib
-
Установка:
git clone --recursive https://github.com/AsuRaHan/GameOfLife3D.git
cd GameOfLife3D
git submodule update --init --recursive
- Обновление репозитория и подмодулей:
- Перейдите в вашу директорию проекта
git pull origin main
git submodule update --recursive --remote
-
Сборка:
- Откройте проект в Visual Studio 2022 или выше.
- Настройте для разработки на Windows с поддержкой OpenGL.
- Соберите решение.
-
Сборка через гитхаб
- Внесите изменение в проект, подготовте релиз.
- Сделайте
git tag
.
git tag -a v1.0.0 -m "Версия 1.0.0"
git push origin v1.0.0
- Запуск:
- Запустите собранное приложение.
- Так же можно передать параметры в комендной строке что бы указать размер игрового поля -gridWidth 200 -gridHeight 150 по умолчанию 300x400. так же можно запустить в полноэкранном режиме передав параметр -fullscreen установить разрешение полноэкранного режима -screenResolution 800x600
life.exe -gridWidth 200 -gridHeight 150 -screenResolution 800x600 -fullscreen
смотрите пример в run_life.bat
-
Управление симуляцией:
- Запуск/Остановка симуляции
- Пошаговое продвижение по поколениям
-
Управление камерой в 3D:
- Панорамирование, масштабирование
-
Управление сеткой:
- Инициализация сетки случайными клетками
- Изменение состояния отдельных клеток мышкой
- C++ для основной логики и механики игры
- OpenGL для визуализации
- Windows API для управления окнами и обработки событий
- ImGuiI для пользовательского интерфейса
-
./game: Основная логика игры:
Grid.h
,Grid.cpp
- Управление сеткойGameController.h
,GameController.cpp
- Управление состоянием игрыGPUAutomaton.h
,GPUAutomaton.cpp
- Клеточный автомат, использующий для расчёта GPUGameStateManager.h
,GameStateManager.cpp
- Управление загрузкой и сохранением мираPatternManager.h
,PatternManager.cpp
- Управление загрузкой готовых паттернов
-
./rendering: Код, связанный с рендерингом:
Camera.h
,Camera.cpp
- Камера для 3D вида.CameraController.h
,CameraController.cpp
- Управление камерой.Renderer.h
,Renderer.cpp
- Логика рендеринга в OpenGL.UIRenderer.h
,UIRenderer.cpp
- Отрисовка и работа с GUI окна и меню.SelectionRenderer.h
,SelectionRenderer.cpp
- Отрисовка линий выделения поля мышкой.GridRenderer.h
,GridRenderer.cpp
- Отрисовка навигационной координатной сетки.TextureFieldRenderer.h
,TextureFieldRenderer.cpp
- Отрисовка игрового поля на дальних расстояниях от самого поля, улучшает производительность не влияя на визуальное отображение.CellsViewportRenderer.h
,CellsViewportRenderer.cpp
- Отрисовка игрового поля на ближних расстояниях от игрового поля, улучшает визуальное отображение.IRendererProvider.h
- Проводник дляRenderer
обеспечивающий обмен данными между разными классами. Это простой интерфейс, паттерн провайдер.
-
./mathematics: Математические утилиты:
Matrix4x4.h
,Matrix4x4.cpp
- Операции с матрицами (на данный момент не используется)Vector3d.h
,Vector3d.cpp
- Операции с векторами
-
./windowing: Управление окнами и вводом:
MainWindow.h
,MainWindow.cpp
- Создание окна и базовая обработка событийWindowController.h
,WindowController.cpp
- Обработка событий клавиатуры и мышиGridPicker.h
,GridPicker.cpp
- Обработка кликов по сетке (игровому полю)
-
./system: Настройка системы, OpenGL и пользовательского ввода:
OpenGLInitializer.h
,OpenGLInitializer.cpp
- Инициализация контекста OpenGLGLFunctions.h
,GLFunctions.cpp
- Загрузка функций OpenGL (урезанный GLAD)ShaderManager.h
,ShaderManager.cpp
- Создание компиляция проверка шейдеров (GLSL) OpenGLSettingsManager.h
,SettingsManager.cpp
- Сохранение и загрузка пользовательских настроек.InputHandler.h
,InputHandler.cpp
- Обработчик пользовательского ввода (клавиатура мыш).PerformanceStats.h
,PerformanceStats.cpp
- Собирает статистику. ФПС, колличество симуляций и т.д.InputEvent.h
- Сама структура пользовательского ввода.
-
main.cpp: Точка входа приложения
- Производительность может ухудшаться на очень больших сетках из-за сложности 3D визуализации и вычисления живых и неживых клеток.
- Если устанавливать очень большой мир то требуется довольно продолжительное время для перестроки сетки из за этого игра может зависнуть на некоторое время(зависит от размеров мира)
- Слишком большие миры могут долга загружатся или сохранятся
- Внедрена поддержка различных наборов правил для игры "Жизнь".
- Добавлена функциональность для динамического изменения размера мира.
- Оптимизирован рендеринг для повышения производительности на больших мирах и сложных узорах.
- Реализована загрузка предустановленных узоров из файлов формата .cells, расположенных в папке patterns.
- Улучшено время загрузки и сохранения состояния мира.
- Ускорена перестройка мира при изменении его размеров.
- Оптимизация функций случайного заполнения и полной очистки мира.
Не стесняйтесь сообщать о любых проблемах или предлагать улучшения!
- Если вы хотите внести свой вклад:
- Создайте форк репозитория
- Сделайте изменения в своей копии
- Отправьте pull request с описанием изменений
- Связаться со мной вы можете в телеграмм
- Собираю донаты тут
Это мой первый проект на WinAPI и OpenGL.
- Как работать с OpenGL подглядел тут
- Что такое игра "Жизнь" и про сам клеточный автомат читал тут
- Особая благодарность IT-сообществу моего города
Этот проект находится под лицензией MIT.