openGL不能退出glutMainLoop的问题

时间:2021-12-17 20:36:47

GLUT使我们的应用可以检测到键盘上的输入,无论是”普通”的还是像F1和UP一样的特殊输入.通过这一节我们将了解如何检测按下了哪个键, 我们还可以从GLUT得到什么其他信息, 和如何处理它.

到目前为止你可能注意到, 当你要控制处理某个事件时, 你必须事先告诉GLUT要调用哪个函数. 截止到目前为止, 我们使用GLUT告诉windows系统当窗口要重新渲染时该用什么函数, 当系统空闲时该用什么函数, 当窗口改变大小时该用什么函数.

我们也要为键盘事件做同样的事情. 我们要告诉GLUT当一个键被按下时, 哪个函数将要执行这个过程.

GLUT提供了2个键盘注册回调函数. 第一个, glutKeyboardFunc, 用来告诉windows系统我们调用哪个函数处理”普通”按键. “普通”按键就是指, 单词,数字,任何有ASCII码的东西. 这个函数的语法如下:

void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y));
Parameters:
func – The name of the function that will process the “normal” keyboard events. Passing NULL as an argument causes GLUT to ignore “normal” keys.

这个函数需要三个参数. 第一个是按键的ASCII码, 剩下的是按键时候的鼠标坐标. 鼠标坐标是相对窗口的左上角的.

这个函数的一种可能实现就是当用户按下ESC键时退出应用. 注意到当glutMainLoop()函数执行时它是个无穷循环, ie.它永远不会返回. 唯一退出这个循环的方式就是调用exit函数. 这就是我们的函数将要做的, 当用户按下按下esc键调用exit函数使应用终结.(记得包含stdlib.h)下面我们展示下函数的代码:

void processNormalKeys(unsigned char key, int x, int y) {

if (key == 27)
exit(0);
}

注意我们要用跟上面函数glutKeyboardFunc声明一样的符号. 否则你在vc中就会编译错误. 我们不希望那样, 不是吗?

好的, 我们继续? 现在让我们来解决特殊键. GLUT提供了glutSpecialFunc. 函数语法如下:

void glutSpecialFunc(void (*func) (int key, int x, int y));

Parameters:

func – The name of the function that will process the special keyboard events. Passing NULL as an argument causes GLUT to ignore the special keys.
我们要写一个当按下特殊按键时三角形就会变色的函数. 这个函数按下F1,F2,F3会使三角形分别变成红绿蓝.

void processSpecialKeys(int key, int x, int y) {

switch(key) {
case GLUT_KEY_F1 :
red = 1.0;
green = 0.0;
blue = 0.0; break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}