1

Visual Express 2010 を使用して、C++ と OpenGL を使用して Pong を作成しています。これは、私が最初に作成したゲームの 1 つであり、どのように構築するのが最適かを考えています。私を悩ませている主な部分はゲームメニューです. さまざまなゲーム モードをさまざまな機能に配置し、メイン機能にスイッチを配置する必要がありますか? たとえば、Main.cpp には次の行を含めます。

glutDisplayFunction(maincode)

別のファイルでは、メインコードを次のように定義します (ここでも疑似コード)。

maincode():
    switch m:
       case 1:
           singleplayer = true
           multiplayer = false
           menu = false
       case 2:
           singleplayer = false
           multiplayer = true
           menu = false
       case 3:
           singleplayer = false
           multiplayer = false
           menu = true

次に、各ファイルで、singleplayer、multiplayer、menu の値をチェックして現在のモードを判断し、それに応じてコードを表示します。

ただ、ゲームが複雑になればなるほどこの方法も複雑になる気がするので、これは適切な方法ではないと思います。

ゲームとメニューをどのように構成すればよいですか?

PS 私は生計を立てる C++ プログラマーですが、ゲームのプログラミング経験がありません。

4

3 に答える 3

4

bool必要な情報が現在どのモードにあるかだけである場合、3つの異なる状態(合計8つの異なる状態、そのうち3つは有効)を持つことは不必要な複雑さです。

列挙型を使用することをお勧めします。

enum GameMode {

  GM_SinglePlayer, GM_Multiplayer, GM_Menu

};

およびタイプの単一変数GameMode

GameMode mode;
mode = GM_Menu;

相互に排他的な(ここで見逃した点です!)状態を切り替えることは、プログラミングの重要な概念であるため、間違いなく正しい方向に進んでいます。働き続けます。

于 2011-06-12T17:51:16.743 に答える
0

GUIアプリケーションを整理する最良の方法は、MVCデザインパターンを使用することです。それか、最初に小さな変更のプレゼンターです。

それを知っていると、あなたのような質問への答えは簡単に答えられます(Alexander Gesslerの答えは大丈夫です)

于 2011-06-12T18:33:52.213 に答える
0

glutDisplayFunc()ものを表示するための簡単な方法ですが、単純なプロジェクトを作成するときは、価値があるよりもすぐに面倒になります。

マルチスレッド化して、glutDisplayFunc() が読み取るためにゲーム状態の一定のコピーを保持していない限り、私はそれを使用しないことをお勧めします。

ゲーム ループについては、OpenGL に動かされるよりも、OpenGL を動かしたほうがよいと思います。

enum EMode { ...etc };

EMode menu();
void single();
void multi();

int main()
  {
    init(...);
    bool loop = true;
    while(loop)
      {
        switch(menu())
          {
            case EMode.single:
              game_loop(1);
              break;
            case EMode.multi:
              game_loop(2);
              break;
            case quit:
              loop = false;
            ...etc
          }
      }
    finish(...);
    return 0;
  }

シンプルなメニュー ループ。(コードスタイルがいつもと違うのは許してください)。
これは素晴らしいレイアウトではありませんが、単純なゲームには適しています。

  • init()openGL を初期化します。
  • menu()single()およびmulti()それぞれに独自のループがあり、バッファを手動でレンダリングおよびスワップします。
  • menu()選択されたメニュー項目を指定する値を返します。


一定速度で実行され、CPU を浪費しないゲーム ループ。

void game_loop(int players)
  {
    CGame game = new Game(players);
    bool loop = true;
    time_type next_frame = get_time() - 1;
    while(loop)
      {
        time_type time = get_time();
        if(time > next_frame)
          {
            do_input(game);
            while(time > next_frame)
              {
                game.tick();
                next_frame += frame_period;
              }
            do_render(game); // draw stuff here, and swap buffers.
          }
        else
          {
            // Don't waste CPU (optional).
            wait_till(next_frame);
          }
      }
  }

繰り返しますが、素晴らしいものではありませんが、十分に機能します。(私はこのようなものを使用します)。

  • CGame はゲーム クラスです (OO にしたい場合)。

  • get_time()、wait_til()、time_type などはすべて構成されています。機能/タイプに合ったものを使用してください。

頭のてっぺんからすぐに-おそらくいくつかのバグさえあります-しかし、それはあなたにアイデアを与えるかもしれません.

于 2011-06-12T19:49:38.963 に答える