Как правильно использовать glutSpecialFun c? - PullRequest
1 голос
/ 20 марта 2020

Я хочу увеличить свой квадрат go при нажатии 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();
}

Я использую gluSpecialFun c.

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.1 в displayScene, квадрат нажимается при нажатии любой клавиши.

Я неправильно использую glutSpecialFunc? Потому что я использовал его раньше, и он работал нормально. Чего мне не хватает?

1 Ответ

1 голос
/ 20 марта 2020

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 в зависимости от состояния keyUpPressed. Постоянно перерисовывать сцену, вызывая glutPostRedisplay in displayScene

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

    // [...]

    glutSwapBuffers();
    glutPostRedisplay();
}
...