c++ - 处理键盘输入的回调

标签 c++ opengl callback keyboard glut

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

我正在从 main() 函数中调用 glutKeyboardFunc(),并将其传递给 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() 结束?如果是这样,那么在 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
}

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

相关文章:

python - 使用 pybind11 构建 cpp

c++ - 使用 Boost 计算 Champernowne 常数 C10

opengl - 使用顶点/像素着色器(Open GL/DirectX)进行通用计算

c# - 从托管 C# 回调非托管代码

javascript - mixitup 根据 mixEnd 后的过滤器选择显示 div

c++ - 正确处理 Persistent<ArrayBuffer>

c++ - 使用 ffmpeg (c++) 编码 AAC

OpenGL 读取像素的速度比 glReadPixels 快

c++ - 如何使用 OpenGL 绘制 OpenMesh

javascript - `setImmediate()` 和 `setTimeout()` 的计时如何受进程性能的约束?