Как я могу использовать взаимодействие с клавиатурой в этом коде - PullRequest
0 голосов
/ 11 мая 2019

Я хочу использовать клавиатуру для перемещения объекта на пути, но после использования функции клавиатуры объект не перемещается. Пожалуйста, помогите мне с этим. После применения функции клавиатуры объект не перемещается с места.

Я хочу добавить 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 Ответ

1 голос
/ 11 мая 2019

Вы должны нарисовать сцену в обратном вызове дисплея 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();
}

Я рекомендую сделать замену буфера (glutSwapBuffers) только в disaply.Удалите его из других функций.
Используйте glutPostRedisplay, чтобы отметить текущее окно как нуждающееся в постоянном повторном отображении.

...