Я переношу 2D-игру на основе плитки на C++, потому что я действительно не поклонник Java (некоторые функции хороши, но я просто не могу с ней привыкнуть). Я использую карты с черепицей TMX. Этот вопрос касается того, как перевести определения объектов в реальные игровые объекты. В Java я использовал отражение для выделения объекта указанного типа (учитывая, что он получен из основного игрового объекта).Назначение типа объекта объекта
Это хорошо работает, но эта функция недоступна на C++ (я понимаю, почему, и я не жалуюсь. Я нахожу отражение беспорядочным, и я не решался использовать его в Java, ха-ха). Мне просто интересно, как лучше всего перевести эти данные. Моя идея была базовым классом, из которого могли бы образовываться все сущности (это кажется довольно стандартным), а затем загрузчик распределяет производные типы на основе значения «type» с карты TMX. Я подумал о двух способах этого.
- Гигантский блок-блокировка. Длительный и отвратительный. Я сомневаюсь, что кто-нибудь предложит это (но это очевидно).
- Используйте карту std ::, которая будет сопоставлять произвольные имена типов с функцией выделения указанных классов, соответствующих указанным именам типов.
- Наконец, я думал о создании сущностей одного базового класса и использовании сценариев для разных типов сущностей. Сами скрипты должны регистрировать свой тип сущности с помощью системы, хотя при загрузке игры необходимо будет загружать сценарии типа сущности (это может быть сделано с помощью одного сценария объявления основного сущностей, который приведет к количеству изменений для каждого объекта до 2 : создание сущности и регистрация субъекта).
В то время как вариант 2 выглядит довольно хорошо, мне не нравится изменять 3 части кода для каждого типа (определяя класс сущности, определяя функцию выделения и добавляя функцию к std :: map) , Вариант 3 звучит отлично, за исключением двух вещей в моем сознании: я боюсь скорости сугубо сугубо скриптов. Кроме того, я знаю, что добавление скриптов к моему движку будет большим проектом само по себе (добавление всех вспомогательных функций для взаимодействия с библиотекой будет интересным).
Кто-нибудь знает о лучшем решении? Может быть, не лучше, а просто чище. С меньшим количеством изменений кода на тип сущности.
Мне нравится эта идея, но я думаю, что стоит отметить, что для того, чтобы достичь этого, предприятие будет нуждаться в какой-то статический (для регистрации без основной функции, вызывающей его явно, поэтому сокращается количество изменений кода.) Это не является «изначально» возможным в C++, но может быть достигнуто следующим образом: 'class Foo { private: \t static bool __st_init; \t статической BOOL static_init() { \t \t/* делать все, что требуется при статическом время инициализации */ \t \t возвращение правда; // или false, чтобы указать статический сбой инициализации \t} }; bool Foo :: __ st_init = Foo :: static_init(); ' – Caleb1994
Ну, код выглядит ужасно в комментариях, но, надеюсь, вы можете увидеть мою мысль. – Caleb1994
@ Caleb1994 взгляните на ссылку, которую я добавил в свой ответ. – hansmaad