Search code examples
c++animationopenglglutopengl-compat

How I can use Keyboard interaction in this code


i want to use keyboard key to move the object on the path but after using keyboard function the object is not moving.Please help me with this.after applying keyboard function the object is not moving from its place.

i want to add 3 different function for wave/path so keyboard interaction is necessary for me, so that i may able to use different keys for different scenes.

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

Solution

  • You've to draw the scene in the display callback glutDisplayFunc.

    Add a scene state (current_scene) and switch the state when a key is pressed:

    e.g.

    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; 
           // [...]
       }
    }
    

    Draw a scene dependent on the state in the display callback:

    void display() {
    
        glClear(GL_COLOR_BUFFER_BIT);
    
        switch(current_scene) {
            case 1: scene1(); break;
            case 2: scene2(); break;
            // [...]
        }
    
        glutSwapBuffers();
        glutPostRedisplay();
    }
    

    I recommend to do the buffer swap (glutSwapBuffers) in disaply only. Remove it form the other functions.
    Use glutPostRedisplay to mark the current window as needing to be redisplayed continuously.