#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