У меня есть движок 2D игр в XNA, который развивается довольно хорошо. Выложено так:
Центральный GameManager, содержащий список SceneObjectManager (для многоуровневой обработки).
SceneObjectManager содержит коллекцию SceneObjects (класс, который наследуется от List, с перегруженным оператором [string]), который является абстрактным базовым классом со строкой для идентификатора объекта.
Есть классы SceneObject2D и AnimatedSceneObject2D, которые наследуются в цепочке (2D от SceneObject, анимированные из 2D). Они содержат соответствующую информацию (положение, исходный прямоугольник, анимации и т. Д.).
Затем у меня есть второй проект (настоящая игра, использующая движок), который имеет такие вещи, как PlayerObject, AIObject, FireballScript и т. Д., Которые наследуются от SceneObject2D и AnimatedSceneObject2D в зависимости от того, что ему нужно (если он отображается, анимируется или даже нет).
Это еще не все, но вы получите картину.
Я начал задумываться о редакторе уровней, потому что выписывать сотни и тысячи сущностей, чтобы повысить уровень и располагать их идеально методом проб и ошибок или обширной математики на бумаге, было бы просто безумием.
Довольно простая концепция ... чистить, выбирать сущности, задавать атрибуты и, в конечном итоге, экспортировать XML-файл, который будет содержать каждую сущность, их позиции и атрибуты, идентификаторы и т. Д. Однако проблема заключается в самой сериализации XML в сохранить объекты.
По сути, я бы сериализовал GameManager, который содержит все менеджеры сцены и все объекты сцены. Тогда я мог бы просто загрузить файл XML, и мой уровень был бы. Но возникает проблема наследования и более сложных объектов, содержащих объекты (и интерфейсы и все такое).
Я не вижу себя записывающим [XmlInclude (typeof (T))] для каждой отдельной сущности для каждого класса, который будет базовым классом, не говоря уже о более сложных объектах.
Я начал наследовать IXmlSerializable, но прежде чем я зайду слишком далеко в этом стремлении выписать WriteXml и ReadXml для всех моих объектов, я хотел бы знать, есть ли лучший, более простой способ сделать это.
Я бы отметил, что это должен быть переносимый формат (следовательно, XML), поскольку я хотел бы повторно использовать экспорт редактора с некоторыми изменениями для использования в движке C ++, который использует ту же схему классов ( Я думаю об использовании Boost.serialization для этого).