2012-01-29 102 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到解决这个问题)

增加了复杂性,但随着可变数量的增长,这样的系统非常值得。

就我个人而言,尽管没有额外的移动部件,但我觉得这很整齐。 如果这不清楚,让我知道,我会尝试修复它:)