2012-02-20 8 views
0

私のゲームプロジェクトでは、私はMVCスキームを使用しています。モデルとビューは完全に分離されています。ビューはオブザーバパターンによって駆動されます。ゲームエンティティ(作成、破棄、更新、...)で何かが起こると、リスナーからその旨が通知されます。モデルの新しいエンティティが割り当てられるとき、私は適切なviewmodel(EntityMesh)を作成する必要があります。viewmodelの "翻訳"と継承のC++ MVCモデル

  • EntityMeshはのviewmodel
  • ゲームのための基本である::エンティティは、この例のモデルの導出木のモデル

のベースは、次のようになります:

  • ゲーム::エンティティ - >ゲーム:: PhysicalEntity - >ゲーム:: PhysicalGridEntity
  • ゲーム::エンティティ - >ゲーム:: ActorEntity - >ゲーム:: FreeActorEntity

これは私が現在この問題を "解決"する方法ですが、将来的には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; 
}; 

これをもっと明確にする方法とOOPを混合することなくどのようにするか考えてみましょう。

EDIT:何パターンは、使用する任意のヒントは、すべての:)

+1

ビジターパターンの使用はどうですか? –

答えて

2

最初に役立つだろう、あなたはコントローラ・コンポーネントを持っていません。モデルとビューを結ぶビジネスロジックはどこにありますか?第二に、私はこれらのすべてのifsで何をしようとしているかわからないが、おそらく工場/訪問者のパターンがあなたを助けるだろう。

+0

私はコントローラに言及していないので、この問題とは関係ありません。これらのifsは、私が現在この問題に取り組んでいる例です。ファクトリ/訪問者のパターンはおそらくうまくいくでしょう... – BlackCat

+1

私はここ2番目のBlackCat、Factory/Visitorが適切と思われます。 – qdii