2012-05-13 7 views
2

Я переношу 2D-игру на основе плитки на C++, потому что я действительно не поклонник Java (некоторые функции хороши, но я просто не могу с ней привыкнуть). Я использую карты с черепицей TMX. Этот вопрос касается того, как перевести определения объектов в реальные игровые объекты. В Java я использовал отражение для выделения объекта указанного типа (учитывая, что он получен из основного игрового объекта).Назначение типа объекта объекта

Это хорошо работает, но эта функция недоступна на C++ (я понимаю, почему, и я не жалуюсь. Я нахожу отражение беспорядочным, и я не решался использовать его в Java, ха-ха). Мне просто интересно, как лучше всего перевести эти данные. Моя идея была базовым классом, из которого могли бы образовываться все сущности (это кажется довольно стандартным), а затем загрузчик распределяет производные типы на основе значения «type» с карты TMX. Я подумал о двух способах этого.

  1. Гигантский блок-блокировка. Длительный и отвратительный. Я сомневаюсь, что кто-нибудь предложит это (но это очевидно).
  2. Используйте карту std ::, которая будет сопоставлять произвольные имена типов с функцией выделения указанных классов, соответствующих указанным именам типов.
  3. Наконец, я думал о создании сущностей одного базового класса и использовании сценариев для разных типов сущностей. Сами скрипты должны регистрировать свой тип сущности с помощью системы, хотя при загрузке игры необходимо будет загружать сценарии типа сущности (это может быть сделано с помощью одного сценария объявления основного сущностей, который приведет к количеству изменений для каждого объекта до 2 : создание сущности и регистрация субъекта).

В то время как вариант 2 выглядит довольно хорошо, мне не нравится изменять 3 части кода для каждого типа (определяя класс сущности, определяя функцию выделения и добавляя функцию к std :: map) , Вариант 3 звучит отлично, за исключением двух вещей в моем сознании: я боюсь скорости сугубо сугубо скриптов. Кроме того, я знаю, что добавление скриптов к моему движку будет большим проектом само по себе (добавление всех вспомогательных функций для взаимодействия с библиотекой будет интересным).

Кто-нибудь знает о лучшем решении? Может быть, не лучше, а просто чище. С меньшим количеством изменений кода на тип сущности.

ответ

2

Вы можете уменьшить количество изменений кода в решении 2, если вы используете самостоятельную регистрацию на заводе. Недостатком является то, что сущности знают этот завод (самостоятельная регистрация), и этот завод должен быть глобальным (например, одноточечным) экземпляром. Если это не проблема для вас, этот шаблон может быть очень приятным. Каждый новый тип требует только компиляции связи одного нового файла.

Вы можете осуществить регистрацию собственного, как это:

// foo.cpp 
namespace 
{ 
    bool dummy = FactoryInstance().Register("FooKey", FooCreator); 
} 

Abstract Factory, Template Style, by Jim Hyslop and Herb Sutter

+0

Мне нравится эта идея, но я думаю, что стоит отметить, что для того, чтобы достичь этого, предприятие будет нуждаться в какой-то статический (для регистрации без основной функции, вызывающей его явно, поэтому сокращается количество изменений кода.) Это не является «изначально» возможным в 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

+0

Ну, код выглядит ужасно в комментариях, но, надеюсь, вы можете увидеть мою мысль. – Caleb1994

+1

@ Caleb1994 взгляните на ссылку, которую я добавил в свой ответ. – hansmaad

Смежные вопросы