Шутер «Проект Кощей», разработка игр на SFML C++
Шутеры — это один из самых популярных жанров видеоигр, который появился в начале 90-х годов. Первые шутеры были созданы для персональных компьютеров и имели простейшую графику и управление. Однако, они были невероятно популярны, и в скором времени стали самыми продаваемыми играми.
Первая игра, которую можно отнести к жанру шутеров, была Wolfenstein 3D, созданная компанией id Software в 1992 году. Она является первой игрой, в которой игрок управляет персонажем от первого лица, противостоящим врагам на экране. Wolfenstein 3D также стала первой игрой, которая использовала 3D‑графику в реальном времени. Она была невероятно популярна и стала основой для многих последующих шутеров.
В 1993 году id Software выпустила игру Doom, которая стала еще более популярной, чем Wolfenstein 3D. Doom была первой игрой, которая использовала сетевой мультиплеер, что позволило игрокам из разных частей мира сражаться друг с другом через интернет.
В 1996 году компания Valve выпустила игру Half‑Life, которая стала новой эволюцией жанра. Она представила новые элементы, такие как непрерывный геймплей, сюжет и персонажи, а также новую графику и физический движок.
Шутеры продолжают развиваться и совершенствоваться по сей день, и их популярность не угасает. Они стали неотъемлемой частью игровой индустрии и позволяют игрокам окунуться в захватывающий мир сражений и экшена.
Шутер «Проект Кощей»
Класс Player
player.h
player.cpp
В конструкторе класса player устанавливаем начальные значения свойствам и создаём анимацию перемещения и гибели персонажа. Картинки для анимации берём из файла player.png.
С помощью метода setOrigin(m_Sprite.getGlobalBounds().width / 2, m_Sprite.getGlobalBounds().height / 2) выставляем координаты положения спрайта в центр спрайта.
Метод void spawn(sf::IntRect planet, sf::Vector2f resolution, int tileSize), появления плеера в игровом мире, в параметрах принимает: размер игрового мира planet, разрешение экрана resolution, размер плиток текстуры tileSize, из которых строится игровой мир.
Метод bool hit(sf::Time timeHit) наносит урон игроку при условии, что его жизнь m_Health не равна нулю и время предыдущего получения урона timeHit.asMilliseconds()- m_LastHit.asMilliseconds() не меньше 200 миллисекунд. Метод возвращает состояние после нанесения урона — урон получен или нет. В параметрах метода передаётся время нанесения урона timeHit.
Метод FloatRect getPosition() возвращающий границы области, занимаемые плеером. Данный метод предназначен для вычисления столкновения плеера с другими объектами. В этот метод внесены поправки границ с учётом прозрачных полей анимации.
Метод void draw(sf::RenderWindow& win) const рисующий игрока в графическом окне, в параметрах принимает ссылку на графическое окно win.
Метод void move(playermove mov) меняет вектор направления движения плеера. В параметрах принимает выбранное направление движения mov.
В параметрах метода увеличивающего максимальный размер жизни void upgradeHealth(float heal), передаём вещественное значение heal, на которое увеличиваем максимальный размер жизни.
В параметрах метода восстанавливающего здоровье void increaseHealthLevel(float amount), передаём количество единиц amount, для восстановления жизни игрока m_Health.
В параметрах метода void update(sf::Time deltaTime, sf::Vector2i mousePosition), передаём единицу времени deltaTime и положения курсора мышки mousePosition. С помощью свойства m_time_moving подсчитываем интервал времени.
Если плеер в движении m_animMove и его жизнь m_Health больше нуля, проигрываем анимацию перемещения.
Если жизнь игрока m_Health равна нулю или меньше нуля, меняем анимацию на анимацию смерти и проигрываем её.
Если проигрыш анимации завершён getEndAnim(), устанавливаем статус игрока m_live мёртв.
В данном разделе кода, с интервалом 5000 микросекунд, перемещаем персонажа согласно установленного вектора перемещения m_move.
Делаем проверку выхода персонажа за границы игрового поля и возвращаем его обратно если это произошло.
По формуле вычисляем угол angle, на который смотрит плеер.
Устанавливаем новые координаты спрайта, и поворачиваем спрайт на ранее вычисленный угол angle.
MonsterPlanet.h
Создаём заголовочный файл планета монстров. Объявляем функцию построения игрового фона int createBackground(sf::VertexArray& rVA, sf::IntRect planet, int index).
В параметрах передаём ссылку на массив вершин rVA, размер игрового поля planet, номер игрового уровня index.
В определении функции запускаем генератор случайных чисел. Инициализируем переменные.
Устанавливаем координаты для каждой вершины четырёхугольника.
Для границы игрового поля используем текстуру стены, остальную часть игрового поля заставляем текстурой ландшафта в случайном порядке.
Меняем позицию перебора массива вершин currentVertex. Возвращаем размер текстуры TILE_SIZE.
Класс GameEngine
GameEngine.h
GameEngine.cpp
В конструкторе устанавливаем параметры графического окна m_window, состояние игры m_state, размер вида m_mainView и координаты игрового поля m_planet.
В методе обработки событий void input(), нажимая пробел, меняем состояние игры с загрузки на показ заставки, далее на загрузку уровня. Нажимаем ещё раз пробел и начинаем игру. В дальнейшем в этом участке кода мы реализуем заставку загрузки игры и предысторию.
Более подробную инструкцию вы можете получить, посмотрев видео «SFML C++ games Шутер Проект Кощей »