0

次のようなデザインでゲームエンジンを作ることを考えています。

主な特徴は、ゲームメニューとゲームレベルをカバーする、いわゆるシステムを作成することです。これらのシステムにはWindow、描画、Inputフェッチ、Sound再生、およびNetworkサーバーとの通信などのオブジェクトが用意されています。

class System // abstract class
{
     Window* Window;
     Input* Input;
     ...

     System(Window* Window, Input* Input, ...)
     {
          this->Window = Window;
          this->Input= Input;
          ...
     }

     virtual Pause() = 0;
     virtual Resume() = 0;
}

main関数はシステムを処理し、メニューとレベルを処理します。SayLevelOneはから派生していSystemます。

int main()
{
     LevelOne Tutorial(&Window, &Input, ...); 
     Tutorial.Pause();
     ...
}

このようにして、私のコードは構造化され、(私の意見では)理解しやすくなります。しかし、主な機能はどのようにシステムと通信できるでしょうか?

たとえば、メニューは、ユーザーがレベルを選択したことをメイン機能にどのように伝えることができますか?また、どのレベルを選択しましたか?main関数にメニューを削除させ、新しいレベルのオブジェクトを作成させるため。

4

1 に答える 1

1

あなたがここでやろうとしているのは、完全なモデル ビュー コントローラー アーキテクチャを編成することだと思います。ここで提供したコードは、そのモデルとコントローラーの部分です。Web 上の MVC に関するいくつかの説明を参照してください。

http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html

サブシステムからのメッセージをリッスンしようとして、結果として適切なアクションを呼び出す単一の main() 関数がある場合は、シングルスレッドのリアクティブ メッセージ ループを実装しようとしています。Qt GUI メッセージやネットワーク イベントなどの他のメッセージをリッスンできる ACE リアクターを実行してから、サブシステムを適切に呼び出すことを検討できます (ただし、パフォーマンスの問題が発生する可能性があります)。

http://www.cs.wustl.edu/~schmidt/PDF/reactor-rules.pdf

私はビデオ ゲーム プログラミング用のグラフィック エンジンに詳しくありませんが、ほとんどのグラフィック ライブラリでは、初期化中にメッセージ ループが提供されるため、この種の詳細を確認する必要はありません。通常は、グラフィックス オブジェクトを作成し、ライブラリのメイン メッセージ ループに登録するだけです。

また、グラフィックス イベントをリッスンするメッセージ スレッドと比較して、ネットワーク イベントをリッスンする別のスレッドを使用することをお勧めします。ワークアウトを分離し、グラフィックスのパフォーマンスを向上させるのに役立ちます。

于 2012-10-07T14:39:35.323 に答える