Hammerill Light Logo

Sand-Box2D возвращается

Sand-Box2D возвращается

30 июля 2024 г.

Привет! Сегодня я снова начал работать над Sand-Box2D.

Вы не знаете, что это такое? Погодите, сейчас всё объясню.

Это игра, которую я написал на C++ с библиотекой Box2D в качестве физ. движка. Я просто хотел изучить эти вещи, а также библиотеку SDL2, чтобы создавать окна и рисовать в ней какую-нибудь графику. OpenGL в то время казался мне слишком сложным, поэтому я решил остаться с рендерером SDL2.

Поискав, как это сделать, я нашел в интернете небольшой проект (автор Simon Ranftl), который этим и занимается. Это небольшая программа C++ для Mac (дополнительно поддерживаются Windows и Linux), которая использует Box2D для создания среды, в которой коробка падает на платформу.

Обновив свой проект на основе этого, я решил дать ему название и превратить его в игру, в которую можно играть на ПК и PS Vita (позже, возможно, и на мобильных устройствах) под названием Sand-Box2D.

Я оставляю тут GIF-ку, чтобы вы могли посмотреть, как выглядит игра (её также можно было увидеть на параллаксе на главной):

Sand-Box2D Video Sample

Что меня действительно заинтересовало, так это то, как я смог скомпилировать этот маленький проект для моей PS Vita. После нескольких часов попыток правильно настроить VitaSDK и связать все библиотеки (в VitaSDK предустановлен Box2D!) я наконец-то скомпилировал файл main.cpp, который мог инициализировать рендерер и действительно показать мне результат. Здесь я оставляю видео с того самого момента, 24 августа 2022 года (оно было записано вскоре после моего первого прибытия в мой нынешний город!):

С тех пор я работаю над этим проектом в режиме "Vita-first", то есть когда я работаю на ПК и добавляю новую функцию, я должен сначала запустить игру в окне 960х544 (разрешение экрана PS Vita), потом скомпилировать и запустить на самой Vita и только потом работать в других разрешениях.

Как я уже говорил, я просто хотел изучить несколько библиотек C++. Но когда я заглянул в файл main.cpp, предоставленный Саймоном, чтобы узнать, как он использовал две библиотеки вместе (SDL2 и Box2D), я не смог понять всё до конца. В коде были некоторые раздутые части, он порождал больше объектов, чем я видел на экране (именно поэтому я иногда натыкался на невидимые стены), и в целом структура казалась мне слишком тяжелой для понимания.

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

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

Никто. Буквально! Я никогда не выпускал ее, так что это нормально, что люди о ней не знают. Когда я писал эту статью, репозиторий игры на GitHub насчитывал ровно 10 звезд.

Система блога: "А если я сделаю запрос к API GitHub, у проекта прямо сейчас... 11 звёзд. Однако у нового репозитория 2 звезды. Круто, да?"

Разрабатывая эту игру, я понял, что мне нужно сделать все модульным: расположение уровней, обработку нажатий кнопок в игре... Потому что в ином случае всё это было бы захардкожено.

Когда я переносил жёстко закодированные части кода в отдельный файл, начинал думать о его формате в JSON и о том, что ещё я мог бы туда поместить, я подумал: "Погоди! То, что я делаю прямо сейчас, так создаю уровень!" - и действительно, я создавал уровень. Целую систему загрузки пользовательских уровней, если быть точнее.

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

Но ещё я обнаружил, что импортировать скрипты Python внутри такого проекта очень просто. Это означало, что в какой-то момент я мог запустить файл Python, импортирующий модуль из моей C++ игры, дабы вызывать функции C++ оттуда.

И я это сделал! И на ПК, и на PS Vita (не забывайте, что проект всё ещё "Vita-first"). Если бы вы скомпилировали игру с правильными настройками, то при нажатии кнопки РЕДАКТОР УРОВНЕЙ вы бы на самом деле запустили скрипт Python, который вызывает функцию C++ "играть случайный звук" в цикле и, таким образом, издаёт громкий шум. Я не могу передать, как меня это обрадовало, когда увидел такое впервые.

Это лишь один маленький тест. Я хочу сделать то же самое в самом редактировании уровней, дабы оно действительно было интересно. Можно посмотреть концепцию вот здесь.

Итак, отвечая на вопрос, кто будет в неё играть: это будут люди, ищущие способ заниматься творчеством, находясь в пути с PS Vita на руках, создавая уровни, но не только (уровни можно создавать во многих играх для Vita на самом деле), а также писать для них скрипты Python прямо на ходу.

Разве это не хорошо, как возможность? Когда я был маленьким, это могло бы быть моим любимым занятием наряду с другими вещами, которые я мог делать на ходу: как во времена Nokia Symbian, например. Вы же знаете, что были кнопочные телефоны, на которых был, в самом деле, Python, а множество программ на нём базировалось? Я это знал, и я знал, что должен был изучить его, что всё-таки и сделал. Куча проектов с использованием AppUiFw: ремейк игры "Asteroids" с использованием формул sin/cos для вращения ракеты, когда мне было около 14 лет, а никто меня и не заставлял изучать всю эту математику в таком раннем возрасте; небольшая игра, в которой нужно ловить фрукты сверху; программа, которая позволяет мне легко использовать внутреннюю функцию преобразования текста в речь; всё это написано непосредственно на телефоне без использования ПК и т.д. и пр... Эх! Всё-таки мне не хватило ума всё это сохранить где-то или кому-то отправить. Всё это сейчас хранится на моей Nokia C5, которая спокойно ждёт меня в моем доме в Мариуполе, а из-за войны я не смогу увидеть этого всего вновь в течении многих лет.

Ах, извините, я немного переборщил. Просто надо было где-то высказаться.

В любом случае, у вас есть ответ. Эта игра создана для тех, кто хочет создавать интересные вещи напрямую на PS Vita. И не только на Vita, если кто-то портирует игру на Switch (у меня его нет), это было бы здорово. И на Steam Deck, если нам удастся выпустить игру в Steam.

Итак, теперь мне нужно просто что-то начать делать с этой игрой.

Я начну с полного рефакторинга игры (пересоздаю её. Опять). Это гарантирует, что я буду использовать весь свой опыт в архитектуре, полученный в этом году, а в игре не будет некоторых устаревших проблем (например, привязка всех событий по времени к кадрам. Это означает, что игра работает только в 60FPS!).

Я позабочусь о том, чтобы она работала безупречно на всех платформах, к которым у меня есть доступ (Windows, Linux, macOS, PS Vita, позже, наверное, на некоторых мобильных), чтобы я не зависел конкретно от SDL2 и SDL2_Renderer (чтобы иметь возможность рендерить игру с помощью GLFW и OpenGL или Metal, например) и чтобы я мог создать редактор уровней на основе кода самой игры. Это бы очень помогло.

Теперь, я думаю, это прекрасно объясняет, что я собираюсь делать. До скорого!