OpenGL — щелчок левой кнопкой мыши продолжает удалять мою сетку

#c #opengl #visual-c #glut

#c #opengl #visual-c #перенасыщение

Вопрос:

Я создал drawGrid() функцию, которая рисует квадратную сетку вдоль моих осей X и Y, которая отлично работает. Затем я создал menu() функцию (вызываемую в main() ), которая включает и выключает сетку, вот код для этого:

 void menu(int item)
{
    switch (item)
    {
        case MENU_SWITCH_OFF_GRID:
        {
            if (gridActive == true)
            {
                gridActive = true;
            }
        }
        break;
        case MENU_SWITCH_ON_GRID:
        {
            if (gridActive == true)
            {
                gridActive = false;
            }
        }
        break;
        default:
            {       /* Nothing */       }
        break;
        }

        glutPostRedisplay();

        return;
    }
}
  

Переключатель меню работает нормально, поскольку я создал глобальную переменную, вызываемую gridActive без значения true или false , поэтому она не сбрасывается каждый раз, таким образом, к ней можно получить доступ в моей display() функции следующим образом:

 if (gridActive != true)
{
    drawGrid();
    gridActive = true;  
}
  

Все это работает просто отлично.

В чем моя проблема?

Моя проблема в том, что всякий раз, когда я нажимаю левую кнопку мыши, моя сетка исчезает, чего я не хочу. Итак, я создал mouse() функцию, подобную этой:

 case GLUT_LEFT_BUTTON:  if (state == GLUT_DOWN)
                        {
                            exit(0);  // this has been added to see if 
                                          // my program will exit!
                        }
                        break;
  

Чтобы проверить, завершается ли моя программа, когда я щелкаю левой кнопкой мыши, и это происходит.

Итак, вместо использования exit(0); какого кода я могу поместить здесь, чтобы моя сетка не исчезала при нажатии левой кнопки мыши? Или проблема не только в этом?

Обновить:

Вот функция мыши:

 void mouse(int button, int state, int x, int y)
{
    // these have simply been set-up for me to use
    // in the future
    switch (button)
    {
        case GLUT_LEFT_BUTTON:  if (state == GLUT_DOWN)
                                {

                                }
                                break;

        case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN)
                                { 

                                }
                                break;
        default: break;

    }
}
  

Ответ №1:

На основе вашего кода:

 if (gridActive != true)
{
    drawGrid();
    gridActive = true;  
}
  

Вы рисуете сетку только тогда, когда gridActive значение false. Однако после каждого рисования вы устанавливаете gridActive=true , который затем остановит его рисование.

Комментарии:

1. хотя не уверен, какое это имеет отношение к нажатию кнопки, если только вы не рисуете только при нажатии кнопки.

Ответ №2:

Без дополнительного вашего кода невозможно точно сказать, что происходит, но эти строки могут выполнять не то, что вы думаете, и это может вызывать некоторые проблемы.

Это никогда ничего не делает.

  if (gridActive == true)
            {
                gridActive = true;
            }
  

Это:

   if (gridActive == true)
            {
                gridActive = false;
            }
  

это то же самое, что:

 gridActive = false;
  

Однако, чтобы понять, что происходит, нам нужно знать, что происходит, когда вы нажимаете кнопку мыши, когда exit вызова нет, но вы еще не опубликовали этот код.

Кроме того, я не совсем понимаю, что вы имеете в виду под:

Я создал глобальную переменную с именем gridActive без значения true или false, поэтому она не сбрасывается каждый раз

но похоже, что вы создали неинициализированную глобальную переменную и ожидаете, что она имеет какое-то конкретное значение, потому что она неинициализирована?

Комментарии:

1. Вы правы с инструкциями if, поэтому я удалил их, запустил код и получил тот же ожидаемый результат. Кроме того, когда я удаляю свой вызов exit, сетка исчезает.

2. @BenTanos какой код запускается при нажатии кнопки мыши, когда exit вызов удален?

3. Раньше, когда я присваивал глобальной переменной значение true или false, она постоянно возвращалась к этому значению, разве я не должен был этого делать?

4. Опубликуйте код функции, в котором у вас есть строка: case GLUT_LEFT_BUTTON