如何在此代码中使用键盘交互

时间:2019-05-11 11:15:30

标签: c++ animation opengl glut opengl-compat

我想使用键盘键在路径上移动对象,但是在使用键盘功能后对象没有移动。请帮助我。在应用键盘功能后对象没有从其位置移动。

  

我想为wave / path添加3种不同的功能,因此键盘交互对我来说是必要的,这样我就可以针对不同的场景使用不同的键。

void object()
{
    glPushMatrix();
    glTranslatef(x, y, 0);
    glBegin(GL_LINES);
    glColor3f(0, 0, 0);
    glVertex2f(-0.3, 0.1);
    glVertex2f(0.3, 0.1);        
    glEnd();
    glPopMatrix();
    glFlush();
}

void drawsine()
{   glBegin(GL_LINE_STRIP);//Primitive
    glColor3f(255, 0, 0);//Set drawing color 
    int i = 0;
    float x = 0, y = 0;
    for (x = -5; x < 6; x = x + 0.1)
    {   y = (sin(3.142*x)) / 3.142*x;
        glVertex2f(x, y);
        sinex[i] = x;
        siney[i] = y;
        i++;}
    glEnd();
    glFlush();
}

void doFrame(int v) {
    //x = sinex[i];
    //y = siney[i];
    if (x < 5.9)
    {
        x += 0.1;
        y = (sin(3.142*x)) / 3.142*x;
    }
    glutPostRedisplay();
    //glutTimerFunc(x,doFrame,0);
}

void scene1()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glPushMatrix();
    drawsine();
    glPopMatrix();


    //glScaled(0.3, 0.3, 1);
    object();


    //glutTimerFunc(30,doFrame,0);
    glutSwapBuffers();
}

void exit(void)
{
    exit(-1);
}

void myKeyboard(unsigned char key, int x, int y)
{
    switch (key) {
    case 'h':
    {
        scene1();   }
    break;

    case 'e':
    {
        exit(); }
    break;
    }
}

void display() {

    //glClear(GL_COLOR_BUFFER_BIT);


}

void init() {
    glClearColor(1, 1, 1, 1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 7, -5, 5, -1, 1);
    glMatrixMode(GL_MODELVIEW);
}


int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(700, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Roller Coaster Simulation");

    init();

    glutDisplayFunc(display);

    glutTimerFunc(200, doFrame, 0);
    glutKeyboardFunc(myKeyboard);
    glutMainLoop();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您必须在显示回调glutDisplayFunc中绘制场景。

添加场景状态(current_scene)并在按下键时切换状态:

例如

int current_scene = 1;

void myKeyboard(unsigned char key, int x, int y)
{
   switch (key) {
       case 'h': current_scene = 1; break; 
       case 'i': current_scene = 2; break; 
       // [...]
   }
}

根据显示回调中的状态绘制场景:

void display() {

    glClear(GL_COLOR_BUFFER_BIT);

    switch(current_scene) {
        case 1: scene1(); break;
        case 2: scene2(); break;
        // [...]
    }

    glutSwapBuffers();
    glutPostRedisplay();
}

我建议仅在disaply中进行缓冲区交换(glutSwapBuffers)。从其他功能中删除它。
使用glutPostRedisplay将当前窗口标记为需要连续重新显示。