在我的游戏项目中,我正在使用MVC方案。模型和视图完全分开。视图由观察者模式驱动。因此,当游戏实体上发生某些事情(创建,销毁,更新......)时,将通过监听器通知视图。当分配模型中的新实体时,我需要创建正确的viewmodel(EntityMesh)。
对于此示例,模型派生树如下所示:
这就是我目前“解决”这个问题的方法......但是在未来我期待Game + Entity和EntityMesh的30多个衍生物。这是非常丑陋和非OOP设计。
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的情况下使这个更清晰,更多OOP?
编辑:任何暗示使用哪种模式都会有所帮助:)
答案 0 :(得分:2)
首先,您没有控制器组件。连接模型和视图的业务逻辑在哪里?其次,我不确定你要对所有这些ifs做什么,但也许工厂/访客模式会对你有所帮助。