Урок 27 SFML C++, движущиеся платформы

Поговорим о движущихся платформах в платформере :) Что мы знаем о них? Они платформы и они двигаются. Итак, нам необходимо создать класс платформы, он будет наследоваться от Entity, как и все остальные нынешние классы, т.к у платформы есть высота, ширина, координаты, спрайт, текстура и так далее. Ни к чему описывать это каждый раз, поэтому просто унаследуем от Entity, аналогично мы поступали с игроком и врагом.

Видеоверсия http://www.youtube.com/watch?v=pFUWlKubvsc

Класс движущихся платформ назовем … MovingPlatform !

Давайте посмотрим как он выглядит:

Объект платформы имеет такой же конструктор, как и враг:

Первым параметром передаем изображение платформы, затем её имя (для удобства оно соответствует имени в .tmx карте) и в будущем мы сможем расставлять платформы в тайлмап редакторе, а не программно (как с врагами ранее). Затем передаем уровень игры, а так же координаты появления платформы (затем это могут быть координаты объекта платформы из карты tmx, то есть так же, как и с врагами), ну и ширина и высота платформы соответственно.

В функции update и описана логика движения платформы – она меняет своё направление примерно каждые две секунды. Помимо этого у неё может быть и другая логика. Например платформа может ездить от стенки до стенки, аналогично нашему врагу. Всего-то и надо прописан похожие вещи в update платформы.

Прежде чем создать платформу нужно найти для нее спрайт. Я просто накидал спрайт в паинте для теста:

платформа в sfml
платформа в sfml

Если вы в реальной игре будете использовать такую же уродливую платформу как эта, то я вам советую использовать прямоугольник в sfml, нежели спрайт. А вобще найдите красивую платформу, а лучше нарисуйте сами. :) У моей платформы размер 95*22, пригодятся эти цифры при создании самой платформы.

В ф-ции main в месте, где мы создаем различные изображения, добавим еще изображения для платформы:

это изображение мы передадим по ссылке в конструктор, при создании объекта движущейся платформы (так же делали с врагом).

 

Я поставил платформу вот здесь:

платформа в tiledmapeditor
платформа в tiledmapeditor

Теперь наша задача считать её координаты из карты перед созданием(не устану это повторять, но с врагами мы уже тоже так делали:))

Вот кусочек кода – новое с комментариями:

Как вы заметили мы считываем все платформы с карты, затем пробегаясь по вектору, состоящего из этих платформ, добавляем платформы в список, забирая координаты у элемента вектора. ТАК ЖЕ БЫЛО И С ВРАГАМИ!

Итак, храним мы платформы всё в том же списке entities, в  котором мы храним врагов. Тогда нам не нужно будет создавать новый список типа MovingPlatform, кидать туда платформы и потом по нему лишний раз пробегаться, чтобы вызвать update или draw только лишь для платформы.

Ещё разок: так как мы уже закинули платформу в список – нам не нужно еще раз вызывать функцию update для неё, поскольку она уже была вызвана для всех объектов этого списка (см. предыдущ уроки), аналогично с рисованием платформы.

Далее мы пропишем взаимодействие игрока с этой платформой, то есть столкновение с ней. Для этого в том же цикле for где мы взаимодействуем с врагами (до или после этого, я напишу до) напишем (новый код помечен комментариями):

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

ф-цию update игрока перенесем после всех этих взаимодействий с объектами списка:

Вот собственно и всё. Это будет уже работать , т.к рисование объектов списка и ф-цию update мы вызываем для всех в списке Entity, а наша платформа как раз там.

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

Скидываю слегка измененный main.cpp, а так же весь проект: https://yadi.sk/d/nHS_nbO5hoesh

main.cpp

 

 

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.

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