我正在检测按键,并且使用fn(功能),ctrl(控制),alt和fn(功能)进行检测时遇到一些问题。
我可以检测空格键,输入,ESC,字母,数字和光标。但我无法检测到我之前说过的特殊键。当我按下这些键时,这两种方法都不会在屏幕上显示任何内容。
检测普通键的方法
void KeyboardFunc(unsigned char key, int x, int y)
{
int numeros;
Key[key] = true;
cout << "-----------------" << endl;
cout << "PULSE " << (int) key << endl;
cout << "-----------------" << endl;
if(key >= 48 && key < 58)
{
numeros = key;
key = 'a';
}
switch ( key )
{
case ' ': // Space bar
cout << "Barra Espaciadora pulsada." << endl;
break;
case 13: // #13 es Enter
cout << "Enter pulsada." << endl;
break;
case 27: // "27" is the Escape key
cout << "Tecla ESC pulsada." << endl;
exit(1);
case 'a': // Teclado numérico.
cout << "Número pulsado: " << numeros - 48 << endl;
key = numeros;
}
}
检测特殊键的方法:
void SpecialFunc(int key, int x, int y)
{
Arrow[key] = true;
cout << "-----------------" << endl;
cout << "ESPECIAL PULSADO: " << (int) key << endl;
cout << "-----------------" << endl;
switch ( key )
{
case GLUT_KEY_UP: // #73 es cursor arriba
cout << "Cursor ARRIBA pulsada." << endl;
break;
case GLUT_KEY_DOWN: // #81 es cursor abajo
cout << "Cursor ABAJO pulsada." << endl;
break;
case GLUT_KEY_LEFT: // #73 es cursor izquierda
cout << "Cursor IZQUIERDA pulsada." << endl;
break;
case GLUT_KEY_RIGHT: // #81 es cursor derecha
cout << "Cursor DERECHA pulsada." << endl;
break;
case 30: // #30 es alt_a
cout << "Tecla ALT pulsada." << endl;
break;
}
}
答案 0 :(得分:4)
OpenGL不处理用户输入。它是一个绘图API,仅涵盖将点,线和三角形放入光栅像素图缓冲区。
您现在使用的是 GLUT ,这是一个用于小型OpenGL演示的相当简单的框架。 GLUT不是OpenGL的一部分!如果GLUT不再满足您的要求,那么就该继续使用功能更强大的框架,或者从头开始进行所有窗口和输入处理。
答案 1 :(得分:1)
您可以切换到SDL - 获取brutalchess的来源,
http://brutalchess.sourceforge.net/
并查看密钥的处理方式。 datenwolf是对的,opengl与输入(鼠标,键,窗口焦点等)无关。您也可以尝试SFML,它比SDL更简单
http://rastergrid.com/blog/downloads/mountains-demo/
SDL比SFML更灵活,例如KEY_PRESS与KEY_RELEASE不同。
答案 2 :(得分:0)
好的,所以这篇文章很老我知道,但我碰巧在寻找其他东西的时候找到了它。
无论如何回答,因为它可能在将来帮助其他人。
GLUT实际上支持ALT的事件......被按下。
GLUT_ACTIVE_SHIFT - 设置是否按SHIFT键或Caps Lock打开。请注意,如果它们都打开,则不设置常量。
GLUT_ACTIVE_CTRL - 如果按CTRL键设置。
GLUT_ACTIVE_ALT - 如果按ALT键设置。
您所要做的就是:
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
else if (key=='r') {
int mod = glutGetModifiers();
if (mod == GLUT_ACTIVE_ALT)
//piece of code
else if(//...)
//piece of code
}}