我刚刚开始学习OpenGL / Glut,并且遇到了一些问题。每当我单击键key: a时,我都想打印一个字符串a,但是似乎我不知道自己在做什么。

我正在从glutKeyboardFunc()函数调用main(),并将其传递给keyinput(),该函数将测试keyESC还是a。另一件事是,当我尝试从scene1()内部打印内容时,效果很好!嗯,为什么呢?

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();
}

最佳答案

可能是因为GLUT在呈现代码之外调用了keyinput()。

我假设您的绘图函数(glutDisplayFunc或glutIdleFunc)通过调用glClear()开始,通过调用glutSwapBuffers()结尾?如果是这样,则将在调用glClear()之前完成keyinput()内部发生的任何绘制调用,因此将看不到该绘制。

最重要的是,keyinput不会被连续调用。按下键时会调用它。因此,您的文字只会显示一瞬间,而不会一直显示。

我建议你做一个全局变量,

int aIsPressed=0;


在键输入中,将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
}

关于c++ - 回调以处理键盘输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11491797/

10-12 06:00