无法为我想要的openGL和GLUT

时间:2019-03-08 22:08:03

标签: c++ animation opengl glut

当我单击特定对象上的右键时,它开始进行动画处理。但是,无论我单击相同的对象(动画一个)还是停止其他没有动画的对象,动画对象都会停止。但是,我希望动画对象仅在单击时才停止。

如何解决此问题?这是我的onClick和onTimer函数。我应该在结构中使用动画布尔吗?如果可以,怎么办?

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 个答案:

答案 0 :(得分:1)

使用数组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();
}