0

キーの押下を検出していますが、fn(function)、ctrl(control)、alt、およびfn(function)での検出に問題があります。

スペースバー、Enter、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キーを押すか、CapsLockがオンになっている場合に設定します。両方がオンの場合、定数は設定されないことに注意してください。

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 に答える