2012-01-20 10 views
3

Hy、私は自分のゲームでMVCを実装しています。私はゲームロジックからビューを切り離し、コントローラはデカップリングされています。実際にはうまくいきますが、リスナーのパターンや信号が私の場合にはより良いと判断することはできません。C++ Observerパターンリスナイベントメソッド/クラスまたはシグナルとスロット

私はいくつかの純粋な仮想メソッドで基本クラスのエンティティを持っている:

onEntityCreate //Called when new entity is allocated 
onEntityDelete //Called when new entity is deallocated 
onEntityBuild //Called on respawn or spawn 
onEntityDispose //Called before respawn or deallocation 
onEntityTick //called every tick when is entity "alive" 
onEntityUpdate //called when entity position/orientation updates 

私は2つの異なるスレッドでビューとロジックを実行したいと思います。私がロジックの最後にこれらのイベントをディスパッチすることができれば表示することができますが、私はどのようにわかりません。

答えて

2

私の経験では、抽象クラス内のいくつかのハイブリッドシグナル/スロットを使用する必要があります。なぜなら、リスナーパターンはC++ではうまく動作しないからです。例)、リスナーの挿入は非常に困難な作業になります。だから、あなたは素晴らしいGallant Signalsを使用することができ、魔女は委任/信号パターンの非常に高速な実装です:

class EntityProvider { 
public: 
    Gallant::Signal0< Entity* > onEntityCreate; 
}; 

、あなたは、プロバイダを使用したコードに:また

void Example::bindProvider(EntityProvider* provider) { 
    provider->onEntityCreate.Connect(this, &Example::onEntityCreate); 
} 

、取得するにはより良いオブジェクト指向設計では、クラスをプロバイダにバインド/アンバインドする "gluer"クラスを使用する必要があります。これは、イベント管理を集中化し、デバッグの難しい問題を回避するのに適しています。

関連する問題