首页 > 解决方案 > 如何正确使用 glutSpecialFunc?

问题描述

我想让我的方格在UO按下时上升。

void displayScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0,x,0);

    glBegin(GL_QUADS);
    glVertex3f(-0.4,-0.4, -5.0);
    glVertex3f( 0.4,-0.4, -5.0);
    glVertex3f( 0.4, 0.4, -5.0);
    glVertex3f(-0.4, 0.4, -5.0);
    glEnd();

    //x = x + 0.1;

    glutSwapBuffers();
}

我正在使用 gluSpecialFunc。

void ProcessSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
    {
        x = x + 0.1;
    }

    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(0,0);
    glutCreateWindow("OpenGL Window");
    init();
    glutDisplayFunc(displayScene);
    glutSpecialFunc(ProcessSpecialKeys);
    //glutKeyboardFunc(ProcessKeys);
    glutMainLoop();
    return 0;
}

当我离开x+=0.1displayScene,当我按任意键时,方块会上升。

我使用glutSpecialFunc不正确吗?因为我以前用过它,它工作正常。我错过了什么?

标签: openglcodeblocksglut

解决方案


glutSpecialFunc按住键时不会连续调用。按下一个键时调用一次回调。
freeglut提供了glutSpecialUpFunc释放键时调用的回调。

按下时设置状态,释放UP时重置状态:UP

int main(int argc, char** argv)
{
    // [...]
    glutSpecialFunc(ProcessSpecialKeys);
    glutSpecialUpFunc(ReleaseSpecialKeys);
    // [...]
}
int keyUpPressed = 0;

void ProcessSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
        keyUpPressed = 1;
}

void ReleaseSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
        keyUpPressed = 0;
}

改变x依赖的状态keyUpPressedglutPostRedisplay通过调用不断重绘场景displayScene

void displayScene(void)
{
    if (keyUpPressed)
        x += 0.1;

    // [...]

    glutSwapBuffers();
    glutPostRedisplay();
}

推荐阅读