0

我正在检测按键,并且在使用 fn(function)、ctrl(control)、alt 和 fn(function) 进行检测时遇到了一些问题。

我可以检测空格键、回车、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;    
    }
}
4

3 回答 3

4

OpenGL 不处理用户输入。它是一个绘图 API,仅涉及将点、线和三角形放入光栅像素图缓冲区。

您现在使用的是GLUT,这是一个用于小型 OpenGL 演示的相当简单的框架。GLUT 不是 OpenGL 的一部分!如果 GLUT 不再满足您的需求,那么是时候继续使用功能更强大的框架,或者从头开始进行所有窗口化和输入处理。

于 2012-05-26T09:31:54.413 回答
1

您可以切换到 SDL - 获取野蛮棋的来源,

http://brutalchess.sourceforge.net/

并查看其中的键是如何处理的。datenwolf 是对的,opengl 与输入(鼠标、键、窗口焦点等)无关。你也可以试试 SFML,它比 SDL 更简单

http://rastergrid.com/blog/downloads/mountains-demo/

SDL 比 SFML 更灵活,例如 KEY_PRESS 与 KEY_RELEASE 不同。

于 2012-05-26T09:41:03.040 回答
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
}}
于 2015-05-21T12:12:04.660 回答