0

OpenGL/Glut について学び始めたばかりで、いくつかの問題に直面しています。key: aキーをクリックするたびに文字列を出力したいのですがa、何をしているのかわからないようです。

私は関数glutKeyboardFunc()から呼び出しており、それmain()を渡しています。もう 1 つのことは、内部から何かを印刷しようとすると、うまく機能することです。うーん、なぜだろうか?keyinput()keyESCascene1()

void printstr(void* font, char* str, GLfloat x, GLfloat y, GLfloat z)
{
    char* c = str;

    // set the raster position
    glRasterPos3f(x, y, z);

    for(; *c != '\0'; c++)
            glutBitmapCharacter(font, *c);
}

void keyinput(unsigned char key, int x, int y)
{
    switch(key)
    {
    case 27:
        killsound();
        exit(0);
        break;

    case 'a':
        glLoadIdentity();
        glColor3f(0.0f, 1.0f, 0.0f);    // Green
        printstr(GLUT_BITMAP_8_BY_13, "Key: a", 0.0f, 0.9f, 0.0f);
        break;
    }
}

int main(int argc, char** argv)
{
    // initialization and stuff
    glutInit(&argc, argv);
    .
    .
    .
    glutDisplayFunc(scene1);
    glutIdleFunc(scene1);
    .
    .
    .
    glutKeyboardFunc(keyinput);
    .
    .
    .

    glutMainLoop();
}
4

1 に答える 1

1

おそらく、GLUT がレンダリング コードの外で keyinput() を呼び出しているためです。

私はあなたの描画関数 (glutDisplayFunc または glutIdleFunc) が glClear() を呼び出すことによって開始し、glutSwapBuffers() を呼び出すことによって終了すると仮定していますか? その場合、keyinput() 内で行われる描画呼び出しは glClear() が呼び出される前に行われるため、描画は表示されません。

その上、keyinput は継続的に呼び出されません。キーが押されたときに呼び出されます。したがって、テキストは常に表示されるのではなく、一瞬だけ表示されます。

グローバル変数を作成することをお勧めします。

int aIsPressed=0;

keyinput で、メッセージを表示するフレーム数を aIsPressed に設定します (フレームレートを制限している場合は 60、そうでない場合は 1000 を試してください)。

次に、描画関数で、他のすべてを描画するためのコードと一緒にこれを行います。

if(aIsPressed>0)
{ 
    glLoadIdentity();
    glColor3f(0.0f, 1.0f, 0.0f);    // Green
    printstr(GLUT_BITMAP_8_BY_13, "Key: a", 0.0f, 0.9f, 0.0f);
    aIsPressed--; //this way aIsPressed will count down to zero, and the message will disappear again
}
于 2012-07-15T12:32:56.017 に答える