Как сделать платформер в geometry dash

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Geometry Dash

Geometry Dash – аркада про геометрические фигуры, в классическом жанре платформеров и с бесконечными уровнями. Играть в нее можно без интернета, вы с легкостью сможете преодолеть большое количество испытаний, на фоне играют приятные мелодии. Игроков поджидают острые углы, от них исходит опасность, постарайтесь не попадать под воздействие этих препятствий. Геометрический персонаж может настраиваться и менять свой внешний облик. Соберите больше наград и откройте достижения, благодаря которым у вас получится быстрее добраться до финала очередного этапа, а всего здесь их собрано больше 200.

Здравствуйте! Сегодня мы будем писать платформер, используя C++, Box2D и SFML, а также редактор 2D карт для игр Tiled Map Editor.

image

Вот результат (карта создавалась 5 минут + во время сьемки игра тормозила + экран не так растянут — дефект Bandicam):

Исходники и exe — внизу статьи.

Что, где, когда?

Box2D

Эту библиотеку мы будем использовать для симуляции физики в платформере (столкновение с блоками, гравитация). Возможно, не стоило для одних только блоков юзать эту библиотеку, но красиво жить не запретишь ;)
Почему именно Box2D? Потому что это самая распространенная и бесплатная физическая библиотека

Почему SFML? Вначале я хотел использовать библиотеку SDL, но она сильно ограничена в возможностях по сравнению с SFML, многое пришлось бы дописывать самому. Спасибо автору SFML за сэкономленное время!
Ее используем для отрисовки графики

Tiled Map Editor

Что делает тут Tiled Map Editor?
Вы когда-нибудь пробовали создавать карты для игр? Спорим, что вашей первой картой было что-то наподобие такого.

Tiled Map Editor — один из таких редакторов карт. Он хорош тем, что карту, созданную в этом редакторе (состоит из объектов, тайлов, их слоев) можно сохранить в XML-подобном файле .tmx и потом с помощью специальной библиотеки на C++ считать ее. Но обо всем по порядку.

Создание карты

image

Ориентация должна быть ортогональной (если вы не делаете изометрический платформер), а формат слоя XML, мы будем считывать именно этот формат
Кстати, ни формат слоя, ни размер тайлов нельзя будет поменять в созданной карте.

Тайлы

image

В итоге у вас получится что-то вроде этого:

image

В чем смысл слоев тайлов?
Почти в каждой игре есть многослойные карты. Первый слой — земля (лед, чернозем, etc), второй слой — здания (казармы, форт, etc, причем фон прозрачен), третий — деревья (ель, пихта, etc, фон тоже прозрачен). То есть рисуется сначала первый слой, поверх него накладывается второй слой, а потом уже третий.

Процесс создания слоев запечатлен на следующих 4 скриншотах:

image

image

image

image

Объекты

Что такое объект в TME?
Объект имеет свое имя, тип, а также параметры со значениями.
За объекты отвечает эта панель

image

После чего сохраните карту.

В общем, ничего архисложного в редакторах карт нету. Пора переходить к считыванию карты.

Считывание карты

Для считывания XML файлов создана отличная библиотека TinyXML, скачайте ее исходники.

Создаем Level.h для карт


Это начало файла.

Дальше идет структура объекта

Разберем её.
Как уже говорилось, в TME каждый объект может иметь параметры. Параметры берутся из XML файла, записываются в properties, и потом их можно получить любой из первых трех функций. name — имя объекта, type — его тип, rect — прямоугольник, описывающий объект. И наконец, sprite — спрайт (изображение) — часть тайлсета, взятая для объекта. Спрайта может и не быть.

Теперь идет структура слоя — она очень проста


В слое есть прозрачность (да, да, мы можем делать полупрозрачные слои!) и список из тайлов.

Дальше идет класс Level:

LoadFromFile загружает карту из указанного файла. Это сердце класса Level.
GetObject возвращает первый объект с указанным именем, GetObjects возвращает список объектов с указанным именем. Вообще-то, по-хорошему, следовало использовать тип (type) объекта, но мне было удобнее вылавливать блоки и игрока через имя, так как в редакторе имя показывается сверху объекта, а тип — нет.
Draw рисует все тайлы (не объекты!), беря себе экземпляр RenderWindow.

Теперь создаем Level.cpp:

Первым мы обрабатываем структуру объектов


Для Layer реализация не нужна, переходим к Level:

Остальные функции Level:

С Level.h окончено!

Протестируем его.
Создаем main.cpp и пишем:

Карта может выглядеть как угодно!

Можете поиграться с объектами:

image

image

Когда вы наиграетесь с объектами, наступит пора Box2D:

Коробки-коробочки

Открываем main.h, стираем то, что там было написано, и пишем:

Здесь у нас подключены level.h и Box2D.h. iostream нужен для вывода в консоль, random — для генерации направления движения врага.
Далее идут игрок и векторы, каждому врагу, монетке, игроку полагается свой Object и b2Body (тело в Box2D).

Внимание — блокам этого не полагается, так как они взаимодействуют с игроком только на уровне физики Box2D, а не в игровой логике.


srand(time(NULL)) нужен для рандома.

Загружаем карту, создаем b2World, передавая ей гравитацию. Кстати, гравитация может исходить из какого угодно направления, и гравитация из (0,10) действует сильнее (0,1). Потом мы берем нужный нам размер тайлов

Далее создаем тела блоков:

Блоки — статические тела, они не имеют массы и висят в воздухе:

Тут мы устанавливаем позицию блоков. Дело в том, что если просто указать позицию такую же, как у объекта, нас будет ждать коварная ошибка.

Создаем тело блока в world. Далее мы с телом не работаем (в смысле, нигде не храним):

Каждому телу принадлежит несколько shape — фигур. Я не буду подробно разбирать эту тему, так как блокам (и остальным телам) хватает всего-то одного прямоугольника.

Связываем фигуру с телом.

Затем мы делаем то же самое с врагами, монетами и игроком, за небольшими различиями:

Означает, что тело не может вращаться.

Все тела созданы, осталось инициализировать графику!

Хорошо понятный код, создает окно с указанным размером и заголовком:

Тут мы создаем вид (View) для окна.

Зачем это надо? Для того, чтобы придать игре пиксельный стиль, мы умножаем размер экрана на 2 с использованием sf::View и все картинки рисуются в 2 раза выше и шире.

Окно закрывается по нажатию на красный крестик. Такой код был ранее:

Тут уже интереснее! Мы добавляем скорость игроку по нажатию клавиш WAD:

Тут мы обновляем физический мир Box2D. Первый аргумент принимает частоту обновления мира (раз в 1/60 секунд), а также количество velocityIterations и positionIterations. Чем выше значение последних двух аргументов, тем реальнее получается физика игры. Так как у нас нету никаких сложных фигур, как в AngryBirds, а только прямоугольники, то нам достаточно по разу.

Здесь мы обрабатываем столкновение игрока с другими телами:

Обработка столкновения с монетами.
Если какая монета столкнулась с игроком, она просто уничтожается и стирается из векторов:

Если враг сталкивается с игроком, проверяется, выше игрок врага или нет. Если игрок выше врага, то он стирается, а игрок подскакивает вверх.

Если иначе, то игрок отскакивает от врага:

Игрок движется направо или налево в соотвествии с его текущим положением относительно врага.

Если скорость врага равна 0, то ему скорость придается вновь — он движется либо направо, либо налево. Визуально это выглядит как движение рывками.

Работа с графикой. Берем позицию игрока, изменяем центр вида и используем наш вид

Устанавливаем спрайтам игрока, монет и врагов позиции, полученные из b2Body:

Очищаем окна, рисуем тайлы карты, потом игрока, монеты и врагов, после чего представляем окно.

Платформер Geometry Dash SubZero вышел на Android

Студия RobTop Games выпустила ещё один таймкиллер из серии аркадных игр Geometry Dash с уникальной фоновой музыкой. В новой части игры под названием Geometry Dash SubZero, как и прежде, необходимо, управляя кубиком, добраться до конца пути. Но, сделать это не так просто.

Геймплей в Geometry Dash SubZero очень простой — нужно тапать по экрану, чтобы кубик перепрыгивал через препятствия, собирая по пути монетки. Есть специальные платформы, которые позволяют совершать большой прыжок, меняя траекторию полёта. Кстати, кубик можно заменить на любой другой доступный предмет или объект и даже поменять его цвет. Игра требует внимания и моментальной реакции, а для этого желательно попрактиковаться сначала в режиме тренировки.

Платформер Geometry Dash SubZero вышел на Android
Платформер Geometry Dash SubZero вышел на Android
Платформер Geometry Dash SubZero вышел на Android
Платформер Geometry Dash SubZero вышел на Android
Платформер Geometry Dash SubZero вышел на Android
Платформер Geometry Dash SubZero вышел на Android

Geometry Dash v2.112 PC - на компьютер

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






Важно!
Если нет звука в игре, то запускайте прямо из архива! Также на пути игры не должно быть русских папок.
Если ошибка MSVCP100.dll - устанавливаем Visual C++ 2010.
Если ошибка MSVCP120.dll - устанавливаем Visual C++ 2013.

Системные требования:
✔ Операционная система: Windows XP, 7, 8, 10
✔ Процессор: 2.0+ GHz
✔ Оперативная память: 512 MB ОЗУ
✔ Видеокарта: OpenGL 2.0 support
✔ Место на диске: 500 Мб

Жанр: раннер, платформер
Разработчик: RobTop Games
Версия: 2.112
Язык: английский
Активация не нужна

Читайте также: