Пчела на работе, разработка игр на SFML C++ часть 4 "Класс Player"
Класс Player
Перед написанием класса Player, опишем задачи, с которыми должны справляться объекты данного класса:
- создавать анимированного игрового персонажа в графическом окне;
- перемещать игрового персонажа в графическом окне, не нарушая установленных границ;
- иметь свойство состояния жизни и смерти игрового персонажа;
- передавать во внешнюю среду методы, вычисляющие столкновение спрайта с другими объектами.
Рассмотрим закрытые свойства класса Player:
Структура Borders определяет переменные задающие границы перемещения игрового объекта типа Player в графическом окне. По умолчанию границы задаются согласно размеру графического окна, которые передаются по ссылки window.
Объекты SpritePlayer и AnimPlayer создают анимированное отображение игрового персонажа. Свойство step устанавливает шаг перемещения игрового персонажа по оси Х и оси Y. Свойство pos – это начальные координаты игрового персонажа. timeUpdate – свойство подсчёта интервала времени, по окончанию которого периодически будет обновляться игровая логика. Свойство dead – устанавливает статус игрока жив или мёртв.
Рассмотрим открытые методы класса Player:
В перечислении direction, создадим список направлений, в которых будет двигаться игровой объект типа Player.
В параметрах конструктора передаём: ссылку на графическое окно sf::RenderWindow& window, начальные координаты персонажа sf::Vector2f mypos=sf::Vector2f(90,365), имя загружаемой текстуры игрового персонажа std::string const& texture = "image/SPRITESHEET.png", время проигрывания всех кадров анимации float time = 0.5, размер кадров анимации sf::Vector2i spriteSize=sf::Vector2i(100, 100), количество кадров анимации int frame=6 и шаг перехода по вертикали на следующую анимацию int stepy=100. В теле конструктора создаём анимацию и инициализируем переменные, обозначающие максимальное значения границ перемещения персонажа по вертикали и горизонтали.
Методы SetStep(), изменяют шаг перемещения плеера.
Метод move(), задаёт шаг и направление перемещения плеера.
Метод update(), перемещает объект, учитывая интервал времени обновления игровой логики.
Далее идут вспомогательные методы. Метод setBordersPlayer() устанавливающий границы в которых может перемещаться плеер. Метод setDead() устанавливающий статус жизнь — смерть. Метод getDead() возвращающий текущий статус плеера. Метод getPlayer() возвращающий ссылку на спрайт плеера.
Разберём подробно все описанные выше методы.
Метод move() устанавливает направление движения плеера, инициализируя значением соответствующий шаг перемещения. А также изменяет текущую анимацию персонажа, в зависимости от выбранного направления движения.
Метод update(), делает проверку статуса плеера dead, если статус установлен как жив, тогда показывает анимацию игрового персонажа и разрешает перемещаться объекту в графическом окне. В противном случае выполняет логику смерти. В данном варианте спрайт поворачивается на 90 градусов метод setRotation(90) и совершает движение вниз, пока не достигнет границы области перемещения. После чего обновит значение переменных на начальные. Выполнение данного кода происходит с интервалом в 3 миллисекунды.
Остальные методы устанавливают свойства - шаг перемещения плеера и обозначают новые границы, в пределах которых может перемещаться персонаж игрока.
Давайте теперь используем класс Player в нашей разработке.
В классе игровой движок подключим заголовочный файл Player.h. Создадим объект типа Player и назовём его bee, все параметры оставим по умолчанию за исключением графического окна, которое передадим по ссылке. Далее создаём объект прямоугольник drop — это будет капля. Объявим переменную tm, подсчитывающую пройденный интервал времени, спустя который будет периодически выполняться игровая логика.
В методе input() создадим обработчик событий - нажатия на клавиши стрелки.
В этом обработчике метод плеера move(), будет получать соответствующий вектор направления движения, в зависимости от нажатой клавиши. Если клавиша будет отпущена, обозначенный вектор инициализируется нулевым значением.
В методе update() обновляем игровую логику объекта плеер. Высчитываем нужный интервал времени tm, после чего получаем ссылку на спрайт объекта плеер mybee. Перемещаем объект drop по вертикали вниз каждый пройденный интервал времени на один пиксель используя метод move(0,1). Если положение объекта drop превышает установленные максимальные границы, устанавливаем его координаты в начальные. В случае пересечения прямоугольника с объектом типа спрайт плеера drop.getGlobalBounds().intersects(mybee.getGlobalBounds() устанавливаем координаты для прямоугольника в начальное положение rop.setPosition(drop.getPosition().x, 0), а плееру статус мёртв bee.setDead(true).
Разберём более детально процесс определения момента столкновения двух графических объектов.
Каждый графический объект SFML в своём интерфейсе имеет метод возвращающий глобальный ограничивающий прямоугольник - метод getGlobalBounds().
Метод intersects() проверяет - существует ли пересечение между двумя ограничивающими прямоугольниками, границы которых возвращает метод getGlobalBounds().
В параметрах метод intersects() получает глобальный ограничивающий прямоугольник проверяемого объекта. В случае пересечения прямоугольников данный метод возвращает значение true.
В методе draw() рисуем пчелу и падающую каплю объект drop в графическом окне window. Чтобы нарисовать пчелу сначала получаем ссылку на спрайт объекта плеер drawBee и передаём её в метод draw() объекта window.
В конструкторе класса Engine незабываем установить начальные настройки объекта drop().
Более подробную инструкцию вы можете получить, посмотрев видео «Игра на SFML C++ Пчела на работе часть 4 класс Player»
Ля, а автор этого гайда в комментах отвечает?
Я так, на будущее. Думаю завтра потыкать кнопочки и оформить это все в копи-пасту в студии, а потом уже поэксперементировать
Буду очень рад!