Не могу анимировать нужный объект в openGL & GLUT - PullRequest
1 голос
/ 09 марта 2019

Когда я нажимаю правую кнопку на конкретном объекте, он начинает анимироваться. Однако, нажимаю ли я на тот же объект, чтобы остановить его - на анимацию - или на любой другой объект, который не является анимацией, объект анимации останавливается. Но я хочу, чтобы анимационный объект останавливался только при нажатии на него.

Как я могу исправить эту проблему? Вот мои функции onClick и onTimer. Должен ли я использовать анимацию bool в структуре? если да, то как?

if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {

        for(i=0; i<MAX; i++){
            if(mx >= arr[i].xB + 0 && mx <= arr[i].xB + 130 && my <= arr[i].yB + 17 && my >= arr[i].yB + - 17){
                animation = !animation;
                animationNumber = i;
                printf("TRUE\n");
            }
        }

void onTimer( int v) {

    glutTimerFunc( TIMER_PERIOD, onTimer, 0) ;


    if(animation){
        arr[animationNumber].xB++;
    if(arr[animationNumber].xB >= 640)
        arr[animationNumber].xB -= 1410;
    }

    glutPostRedisplay() ; // display()

}

1 Ответ

1 голос
/ 09 марта 2019

Используйте массив bool animation[MAX] вместо единственной логической переменной animation и индексирующей переменной animationNumber.
. При таком решении каждый объект имеет свое собственное состояние, которое указывает, является ли он "оживляющим" или стоит на месте.

bool animation[MAX] = {};

Изменение соответствующего состояния объекта в массиве при нажатии кнопки мыши:

if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
    for (i=0; i<MAX; i++)
    {
        if (mx >= arr[i].xB + 0 && mx <= arr[i].xB + 130 &&
            my <= arr[i].yB + 17 && my >= arr[i].yB + - 17)
        {
            animation[i] = !animation[i];
            printf("TRUE\n");
        }
    }
}

Обход всех объектов в функции таймера и обновление позицийобъекты:

void onTimer( int v) 
{
    glutTimerFunc( TIMER_PERIOD, onTimer, 0) ;

    for (i=0; i<MAX; i++)
    {
       if(animation[i])
       {
           arr[i].xB++;
           if( arr[i].xB >= 640)
               arr[i].xB -= 1410;
       }
    }
    glutPostRedisplay();
}
...