3

OpenGL で学校向けのゲームを書いています。似たような課題が他にもいくつかあるので、OpenGL で一般的なことを行うための小さなフレームワークを作成したいと考えています。以前にいくつかの単純なゲームを作成したことがありますが、通常、入力と画面への描画を処理する IO クラス、メインのゲーム ループ/ロジック用の Game クラス、およびゲーム内にあるあらゆるオブジェクトのクラスに分解します。

SDL を使用する前に、私の質問は、これは OpenGL でこれを行う正しい方法ですか? 私はすでにいくつかのトラブルに遭遇しました。ウィンドウの初期化、シーンの描画、およびマウス クリックを IO クラスで処理する必要があります。したがって、コンストラクタは次のようになります。

IO::IO()
{
    currWindowSize[0] = DEF_WIDTH;
    currWindowSize[1] = DEF_HEIGHT;

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
    glutInitWindowPosition( INIT_WINDOW_POSITION[0], INIT_WINDOW_POSITION[1] );
    glutInitWindowSize( currWindowSize[0], currWindowSize[1] );
    glutCreateWindow( "TEST" );

    setUp();

    glutDisplayFunc(drawScene);
    glutMainLoop();
}

ただし、drawSceneクラスメソッドです。クラスメソッドをglutDisplayFunc()静的にせずに渡す方法はありますか?

4

3 に答える 3

3

残念ながら、はポインタglutDisplayFunc()を取らないvoid*ので、オブジェクト コンテキストを偽造することができます。静的変数を使用して正しい IO インスタンスを呼び出すことができる静的関数を作成する必要があります。

ただし、パターンにも若干の問題があります。私の知る限りglutMainLoop()、GLUT コンテキストを終了するまで決して返されないため、実質的に返されないコンストラクターがあるため、プログラム フローは不合理です。その呼び出しをrun()クラス内の別のメソッドに移動する必要があります。

(個人的には、メインループを作成する必要がありますが、GLUT によるコールバック全体の混乱を回避する GLFW を使用します。)

于 2010-01-24T23:45:27.070 に答える
2

二点、

まず、glutMainLoop が返されることはなく、メッセージのディスパッチを開始します。コンストラクターから呼び出したため、クラスはまだ適切に構築されていない可能性があります。さらに、glut は複数のウィンドウをサポートしており、glutModalLoop を呼び出す必要があるのは一度だけです。

第二に、あなたが指摘したように、glutDisplayFunc に渡されるメソッドは静的でなければなりません。大量のウィンドウ ID を IO ポインターに関連付ける静的配列が必要になります。glutCreateWindow が IO インスタンスによって呼び出されると、返された ID と IO インスタンスを配列に格納します。静的 drawScene が呼び出されるたびに、glutGetWindow を呼び出して現在のウィンドウの ID を取得し、関連する IO ポインターを検索して、非静的 drawScene 実装を呼び出します。

于 2010-01-25T22:10:18.313 に答える
0

SDL を使用する前に、私の質問は、これは OpenGL でこれを行う正しい方法ですか?

私は GLUT を完全にバイパスしたいと思います (OpenGL の内臓と OS ウィンドウ システム インターフェイスを学びたい場合)。Plus GLUT は iPhone ではサポートされていません (将来このプラットフォームをターゲットにする場合)。

したがって、アイデアはWGL、Windows、GLXLinux、およびCGLOS Xで使用することです。

于 2010-01-25T00:09:21.023 に答える