В моем игровом проекте я использую схему MVC. Модель и Вид полностью разделены. Вид управляется паттерном наблюдателя. Поэтому, когда что-то случится с представлением игрового объекта (создать, уничтожить, обновить, ...), слушатель получит уведомление Когда новая сущность в модели выделяется, тогда мне нужно создать правильную модель представления (EntityMesh).
- EntityMesh является базой для модели представления
- Игра :: Сущность является основой для модели
для этого примера дерево деривации модели выглядит следующим образом:
- Game :: Entity -> Game :: PhysicalEntity -> Game :: PhysicalGridEntity
- Game :: Entity -> Game :: ActorEntity -> Game :: FreeActorEntity
Вот как я сейчас "решаю" эту проблему ... но в будущем я ожидаю более 30 производных от Game :: Entity и EntityMesh. И это очень уродливый и не ООП дизайн.
EntityMesh* WorldView::_translate(Game::Entity* const ent)
{
//TODO: finish translator...
std::cout << "TRANSLATING!: " << typeid(ent).name() << std::endl;
Game::PhysicalGridEntity* pgent = dynamic_cast<Game::PhysicalGridEntity*>(ent);
if(pgent)
{
std::cout << "CREATING: PhysicalGridEntity" << std::endl;
return new PhysicalGridEntityMesh(this, pgent);
}
else
{
Game::PhysicalEntity* pent = dynamic_cast<Game::PhysicalEntity*>(ent);
if(pent)
{
std::cout << "CREATING: PhysicalEntity" << std::endl;
return new PhysicalEntityMesh(this, pent);
}
else
{
Game::FreeActorEntity* faent = dynamic_cast<Game::FreeActorEntity*>(ent);
if(faent)
{
std::cout << "CREATING: FreeActorEntity" << std::endl;
return new FreeActorEntityMesh(this, faent);
}
}
}
return NULL;
};
есть идеи, как сделать это более понятным и более ООП, не смешивая View и Model?
РЕДАКТИРОВАТЬ: Любая подсказка, какой шаблон использовать поможет:)