переключение оператора C ++ и перенасыщение

У меня есть эта функция, которая говорит, когда я нажимаю a Я переключаюсь между GL_LINE а также GL_FILL, когда я запускаю программу, она начинается с GL_FILL и когда я нажимаю a он переключается на GL_LINE, Однако я хочу, чтобы он продолжал переключаться между a нажата.

может кто-нибудь сказать мне, где я иду не так.

void keyPressed (unsigned char key, int x, int y) {
switch (key){
case 'a':
bool f = false;
if(!f){
glPolygonMode(GL_FRONT,GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);

}else{
//bOutline=false;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
}
f=!f;
break;

}

}

0

Решение

я думаю, что вы должны переключаться между двумя состояниями, которые обрабатываются с помощью f, поэтому вам нужно определить f во внешней области видимости или определить его как статическую переменную, как это

static bool f = false;
3

Другие решения

Вы должны определить f как статическую переменную, чтобы поддерживать ее значение между вызовами функций.
статическое bool f = false;
или просто сделать его глобальной переменной

2

вы определяете бул f внутри функции каждый раз, когда она вызывается, поэтому вы должны либо определить ее как глобальную переменную, я не рекомендую, либо как статическую переменную:

static bool f = false;

Вы также можете использовать glGet с аргументом GL_POLYGON_MODE чтобы найти текущий режим для передней и задней граней, например:

GLint polyMode[2];
//returns front and back modes
glGetIntegerv(GL_POLYGON_MODE, polyMode);

switch(polyMode[0]) {
case GL_LINE:
//add code
break;
case GL_FILL:
//add code
break;
case GL_POINTS:
//add code
break;
}
2

Вы действительно нуждаетесь f? Мне кажется, вы хотите переключиться между двумя значениями, так почему бы не что-то вроде этого:

GLint previous[2];
glGetIntegerv( GL_POLYGON_MODE, previous );
glPolygonMode( GL_FRONT, previous[0] == GL_LINE ? GL_FILL : GL_LINE);
glPolygonMode( GL_BACK, previous[1] == GL_LINE ? GL_FILL : GL_LINE);
1
По вопросам рекламы [email protected]