2012-01-29 94 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

謝謝,看起來像它會工作。 – 2012-01-29 09:52:39

0

我所做的聲明global.h爲我所有的全局。並主要初始化它們。對於我的「基本/常規」變量(即相機,位置,迭代號,...),他們都是單獨聲明的。在主:

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

int main() { 
    ... 
} 

但是對於那些只在一個遊戲模式/電平是「部分具體」,即變量,我做了一個工會和枚舉。

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 

現在哪些可用於:

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

現在,當你的按鍵處理函數,你可以指定一個鍵觸發全球國際[skipLevel。而在其他文件中,你所要做的就是包含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個變量,那麼就只需要存儲48個數據就可以了!

可以輕鬆處理任何變量類型,方法是將其添加到聯合中。

完全可移植

缺點 一定要記住取消引用通用工會變量類型(並不難)

而且WATCHOUT對枚舉使用(你可以使用樣式枚舉像mainMenu_e到解決這個問題)

增加了複雜性,但隨着可變數量的增長,這樣的系統非常值得。

就我個人而言,儘管沒有額外的移動部件,但我覺得這很整齊。 如果這不清楚,讓我知道,我會嘗試修復它:)