2012-01-29 6 views
4

GLUTはすばらしいAPIです。使い方はとても簡単ですが、スコープの扱いに問題があります。コールバックを定義するときにパラメータを渡すオプションはないので、プログラマがグローバル変数に頼っているかのように思えます。今、私はそれ自身のスレッド上で実行して、それ自身のモジュール内のすべてのGLUTコードを持っている、と私はそうのように、モジュールへのエントリポイントで割り当てる静的ポインタ定義:GLUTの使用中にグローバル変数を避ける

メインモジュールを

int main(int argc, char** argv) { 
    int foo; 
    boost::thread graphicsThread(glutMain, argc, argv, &foo); 

    //... 

    graphicsThread.join(); 
    return 0; 
} 

GLUTモジュール

static int* FOO_REF; 

int glutMain(int argc, char** argv, int* foo) { 
    FOO_REF = foo; 
    glutInit(&argc, argv); 
    //etc... 

は、これよりもよりよい解決策はありますか?

答えて

1

freeglutまたはその派生物を使用しており、freeglut誘導体のみに限定したい場合は、その問題を正確に解決するための標準外の拡張があります。すべてのウィンドウにvoid*を関連付けることができます。あなたが望むすべてのウィンドウ単位のデータを含む構造体を作成すると、グローバル全体を完全に避けることができます。

概要:私がやったこと

#include <GL/glut.h> 
#include <GL/freeglut_ext.h> 


void * glutGetWindowData(); 
glutSetWindowData(void *data); 
+0

ありがとう、それは動作するように見えます。 –

0

はすべての私のグローバルに対するGLOBAL.Hを宣言しました。メインで初期化します。私の「基本的/一般的な」変数(カメラ、位置、反復番号など)はすべて別々に宣言されていました。メイン:

include "global.h" 
Vector position_g = ... 
Vector angles_g = ... 
int time_g  = 0; 

int main() { 
    ... 
} 

しかし、「セクション固有」の変数、つまりゲームモード/レベルが1つしかない変数では、ユニオンと列挙型を作成しました。

enum mainGame{skipLevel, ...}; 
enum mainMenu {viewingSettings, ...}; 

typedef union generic_union { 
    int i; 
    char c; 
    bool b; 
    char s[100]; // or char * s; 
    float f; 
} generic; 

globalData変数が宣言されました。使用できるようになりました

extern generic * globalData; // in global.h 
generic * globalData = NULL; // in main 

:あなたのキーを押して処理関数では、あなたがグローバルデータ[skipLevel]切り替えるためのキーを割り当てることができます今すぐ

int main() { 
    ... 
    globalData = malloc (sizeof (generic)*numGlobals); 
    globalData[skipLevel].b = false; 
    ... 
} 

。それ以外のファイルでは、global.hを含めるだけです。

include "global.h" 
void onKeyPress (...) { 
    If (inMainGame) { 
     If (key == SPACE) { 
      globalData [skipLevel] = true; 
      } 
    } 

そして最後に使用:

include "global.h" 
void levelManager() { 
    ... 
    if (globalData[skipLevel]) level++; 
    ... 
} 

賛否 のみの周り変数と1含めるを持ち歩く必要があります。

不要な変数やそのインスタンスで使用している変数を解放することができます。 (「汚染」を減らすのに有用な非常に)。もし1つのゲームモードが1つの変数しか必要としないならば、それはあなたが48を必要とするならば、それを保存しなければならないものです。

任意の変数型をユニオンに追加することで、簡単に処理できます。

が使用されている(あなたがmainMenu_eのように列挙型のスタイルを使用することができます列挙型のための変数の一般的な労働組合間接参照型へ(いないそのハード)

そしてWATCHOUTを覚えておく必要が

短所完全にポータブル

複雑さが増しますが、可変数が増えるにつれて、このようなシステムは価値があるので、このようにしてください。

個人的に私はこれが非常にきちんとしています。 これがわからない場合、私はそれを修正しようとします:)

関連する問題