Часть №5: Добавление мяча в игру «Breakout» на C++/OpenGL

  Дмитрий Бушуев  | 

  Обновл. 20 Дек 2020  | 

 2200

На данный момент у нас есть уровень, содержащий несколько кирпичей разного типа и цвета и подвижную ракетку, управляемую игроком. Единственное, чего здесь не хватает, — это мяча. Наша задача состоит в том, чтобы позволить мячу сталкиваться со всеми кирпичами уровня до тех пор, пока каждый из них не будет разрушен, но всё это при условии, что мяч не выпадет за нижний край экрана.

В дополнение к основным компонентам игрового объекта, объект мяча должен иметь радиус и дополнительную логическую переменную, указывающее на то, зафиксирован (переменная Stuck) ли мяч на ракетке игрока или ему разрешено свободное перемещение. В начале игры мяч находится на ракетке, затем игрок нажимает какую-нибудь клавишу на клавиатуре, и мяч приходит в движение.

Для описания мяча мы создадим производный от класса GameObject класс BallObject, добавив в него еще несколько свойств:

Конструктор класса BallObject инициализирует не только свои собственные переменные, но также и переменные базового класса GameObject. Класс BallObject содержит функцию движения BallObject::Move(), которая позволяет мячу перемещаться с учетом его скорости. Она также проверяет, достиг ли он какого-либо из краев сцены, и если — да, то меняет направление скорости мячика:

В дополнение к изменению направления скорости мяча, мы также должны переместить его обратно в случае, если он достиг края сцены; мяч может двигаться только тогда, когда он не зафиксирован.

Примечание: У нас отсутствует код, позволяющий мячу отскакивать от нижнего края, поскольку игрок заканчивает игру (или теряет жизнь) при достижении мячом нижнего края сцены. Однако позже нужно будет реализовать данную логику где-то в коде игры.

#Класс BallObject

Заголовочный файл — ball_object.h:

Файл реализации — ball_object.cpp:

Теперь давайте добавим мяч в игру. Точно так же, как и в случае с ракеткой, мы создаем указатель на объект класса BallObject и определяем две константы, необходимые для инициализации мяча. Использовать мы будем следующую текстуру:

Код:

Затем мы должны обновлять положение мяча каждый кадр, вызывая функцию Ball->Move() внутри функции Game::Update():

Кроме того, поскольку мяч изначально находится на ракетке в неподвижном (зафиксированном) состоянии, то мы должны дать игроку возможность привести его в движение. За это будет отвечать клавиша Пробел. Для этого мы немного изменим функцию Game::ProcessInput():

В вышеприведенном фрагменте кода, если пользователь нажимает пробел, то переменная Stuck устанавливается в false. Обратите внимание, что пока мяч находится на ракетке в неподвижном состоянии, то помимо перемещения самой ракетки, вместе с ней необходимо перемещать и мяч.

Наконец, добавляем код визуализации мяча:

В результате получается мяч, который вначале игры неразрывно следует за ракеткой и начинает свое самостоятельное движение тогда, когда мы нажимаем пробел. Мяч также должным образом отскакивает от левого, правого и верхнего краев сцены, но, как мы видим, он еще не реагирует на столкновения с кирпичами:

  GitHub / Часть №5: Добавление мяча в игру «Breakout» на C++/OpenGL — Исходный код

Чтобы это исправить, потребуется создать одну или несколько функций, которые проверяют, столкнулся ли объект мяча с любым из кирпичей уровня, и если — да, то кирпич уничтожается. На этих, так называемых, функциях обнаружения столкновений мы и сосредоточимся на следующем уроке.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (6 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *