2012-01-27 13 views
0

私はゲームエンジンを構築しています。私はいくつかのことを再構成しようとしています。すなわち、エンジンの主なコンポーネント(オーディオ、ビデオ、キーボード/マウスIOなど)を管理するEngineManagerです。複数のサーバーが間違ったデザインを指しているクライアントを使用していますか?

あなたがする場合は、これは、をクリーンアップのための主要な実装のアイデア、順番にメッセージを送るであろう、これらの様々な構成要素にイベント処理(SDL中)を介してデータを送信するクライアントとしてEngineManagerを使用することですバック。狂気を避けるために、私は次の実装を持っている:

コンフィグ

class Config 
    { 
    public: 

     Config(const EngineManager* engine, const Controls* controls); 

     ~Config(void); 

     //More functions 

    private: 

     Controls** mControls; 

     EngineManager** mEngine; 

     //More functions/class members 

    }; 

    Config::Config(const EngineManager* engine, const Controls* controls) 
     : mControls(controls), 
      mEngine(engine), 
      mIsInitialized(false) 
    { 
    } 

    Config::~Config(void) 
    { 
     delete mControls; 
     delete mEngine; 
    } 

EngineManager

class EngineManager 
{ 

public: 

    EngineManager(void); 

    ~EngineManager(void); 

    //More functions/class members 

private: 

    Controls* mControls; 

    Config* mConfig; 

    //More functions/class members 

}; 

EngineManager::EngineManager(void) 
    : mControls(new Controls(this)), 
     mConfig(new Config(this, mControls)), 
     mEvent(new SDL_Event) 
{ 
    Init(); 
} 

EngineManager::~EngineManager(void) 
{ 
    delete mEvent; 
    delete mConfig; 
    delete mControls; 
    delete mScreen; 
} 

私がコントロールを投稿するだろうが、それは基本的に設定と同じことを行いクラス - ただし、configへの参照なし。

それでも、何かが

...良い実装がある種の関数ポインタであるかもしれないことに任意のアイデアを私に語りましたか?

+3

RAII用の良いスマートポインタを使用して何が起こったのですか。 –

+0

私はそれを行うことができましたが、この種の通信を処理する関数ポインタはどうでしょうか?ややシンプルなようです。 – zeboidlund

+0

'Config'コンストラクタの' const EngineManager * 'から' EngineManager ** 'への変換(または' Controls'を使った同様の変換)はどうしますか? – Mankarse

答えて

1

ここで最大の設計上の問題は、相互依存関係です。クライアント/サーバーを使用する場合、クライアントはサーバーに依存する必要があります。

クライアントがサーバのアップデートについて知りたい場合は、observer patternを使用してください。
メッセージの返信が必要で、同期メッセージ(受信者がメッセージを処理するまで送信者が待機する)を使用しない場合は、メッセージとともにコールバックを渡す必要があります。ここではファンクタがファンクタにはクライアントへの参照が含まれるため、ファンクタはメッセージを返すことができます。
頻繁に変更されないクライアントが限られている場合は、それらをサーバーに渡すことができますが、クライアントによって実装されたコールバックインターフェイスを使用する必要があります。

関連する問題