2011-05-08 53 views
1

对于最终的项目,我和我的朋友正在制作游戏。我们使用GLUT(我知道,不是最好的选择)。我们想要做的是为不同的游戏模式(例如闪屏,菜单屏幕,游戏屏幕等)提供多种显示回调函数,所以当游戏模式改变时,我们改变回调。所以实际上,就像在GLUT运行时能够调用glutDisplayFunc一样。这可能吗?我们不愿意在整体显示功能中使用巨大的if/switch语句,因为我们认为它可能会影响性能。如果这种担忧没有根据,请说出口!在GLUT中切换显示回调

回答

0

我们不愿意在总体显示函数中使用巨大的if/switch语句,因为我们认为这会影响性能。

它当然不是最好的编码风格,但性能不是一个参数。

你可以使你自己的系统模拟glutDisplayFunc,就像epicGameDisplayFunc那样改变函数指针到传递的函数。

2

glutDisplayFunc需要一个指向显示场景的指针作为参数。使用多个显示功能最简单的方法是简单地使用要切换到的显示器场景功能指针调用glutDisplayFunc。

void render1() { 
    //.. display something 
} 

void render2() { 
    //.. display something else 
} 

//... 
void someEvent() { 
    if(iWantToRender1) { 
     glutDisplayFunc(render1); 
     glutIdleFunc(render1); 
    } else { 
     glutDisplayFunc(render2); 
     glutIdleFunc(render2); 
    } 
} 

这比因为它改变调用哪个函数使用的if/else在render1/render2不同。如果你看看GLUT的文档,http://www.opengl.org/resources/libraries/glut/spec3/node46.html glutDisplayFunc改变了当前窗口的显示函数,而不是像glutTimerFunc那样执行某些东西来运行。

1

这个问题有点古怪,但我偶然发现了这个答案,同时寻找一个完全相同的问题的解决方案。

我认为,更优雅的方法是使用函数指针。首先,创建一个函数指针(可能是全球性的):

void (*foo)(void); 

,您将创建不同的绘图功能,例如:

void draw_1()  
{  
    /* Draw fancy stuff */ 
} 

void draw_2() 
{ 
    /* Draw other fancy stuff */ 
} 

现在你需要一个“主循环,主循环” - 功能,这是由glutMainLoop称为是指指针:

void mainloop_mainloop() 
{  
    (*foo)(); 
} 

正如我所说的,这个功能必须是你的glutMainLoop,所以将其设置:

glutDisplayFunc(mainloop_mainloop); 

glutIdleFunc(mainloop_mainloop); 

当然,你必须某处设置你的函数指针:

foo = &draw_1; 

如果您现在想切换到另一个绘图环境,你只需要改变的指针。例如,您可以在菜单中执行此操作:

if (menuentry==1) foo = &draw_1; 

if (menuentry==2) foo = &draw_2; 

等等......

这使您能够保持在glut mainloop中,而不会弄乱显示功能,并且性能也不会受到影响,因为您只设置了if/switch一次。你只需要一个额外的函数调用,考虑到用于绘制你的东西的函数调用的数量,每个单独的帧都应该是可以忽略的...