Выход из glutFullScreen ()

Я не понимаю, почему, когда я нажимаю ‘f’, он входит в полноэкранный режим, но не выходит из полноэкранного режима. В начале этого метода я установил bool fullscreen = false;

Вот код для моего переключателя:

case 'f': //toggle screenmode
if(!fullscreen){
glutFullScreen();
fullscreen = true;
} else if(fullscreen){
glutReshapeWindow(1200, 900);
glutPositionWindow(0,0);
fullscreen = false;
}
break;

1

Решение

в верхней части этого метода я установил bool fullscreen = false;

Ну что ты ожидать произойдет?

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

Если вы хотите сохранить логическую переменную, которая на самом деле отслеживает ли вы в настоящее время полноэкранный режим, то вам нужно использовать Глобальный. А тебе надо не установите его в начале функции. Вы устанавливаете его один раз при создании окна, и вы устанавливаете его снова только при изменении полноэкранного состояния окна.

3

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

Чтобы восстановить исходный размер окна

… переключить порядок вызова ReshapeWindow и PositionWindow на

glutPositionWindow(0,0);
glutReshapeWindow(1200, 900);

В противном случае он вернется в оконный режим, но не адаптируется к указанному вами размеру окна!

3

Проблема не в коде, который вы разместили выше, как в соответствии с спецификация glutFullScreen окно должно выйти из полноэкранного режима после вызова glutReshapeWindow или glutPositionWindow.

в верхней части этого метода я установил bool fullscreen = false;

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

1

Вместо определения bool в начале метода, вы должны определить глобальную переменную. В противном случае каждый раз, когда вызывается этот метод, он устанавливает полноэкранный bool на 0 и думает, что он не в полноэкранном режиме. Кроме того, вы можете захотеть принять не ответ Евфрата, он делает правильное замечание об организации метода.

0

Попробуй это:

case 'f': //toggle screenmode
fullScreen = !fullScreen;
if (fullScreen) {
glutFullScreen();
} else {
glutReshapeWindow(1200, 900);
glutPositionWindow(0,0);
}
break;
0

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

myGame.c

...
glutSpecialFunc(handleSpecial);

void handleSpecial(int key, int x, int y) {
oglHandleFullScreen(key, x, y);
}
...

Если вы с нетерпением ждете ответа на событие клавиатуры вместо (glutKeyboardFunc), обязательно измените подпись ниже oglHandleFullScreen в (unsigned char key, int x, int y),

fullscreen.h

void oglHandleFullScreen(int key, int x, int y);
void oglWindowed(int positionX, int positionY, int width, int height);
void oglFullScreen();

fullscreen.c

#include <GL/glut.h>
#include "fullscreen.h"
int isFullScreen = 0;
int previousPosition[2] = { 0, 0 };
int previousSize[2] = { 100, 100 };

void oglHandleFullScreen(int key, int x, int y) {
if (key != GLUT_KEY_F11) { // Respond to F11 key (glutSpecialFunc).
return;
}

if (isFullScreen) {
oglWindowed(previousPosition[0], previousPosition[1],
previousSize[0], previousSize[1]);
} else {
previousPosition[0] = glutGet(GLUT_WINDOW_X);
previousPosition[1] = glutGet(GLUT_WINDOW_Y);
previousSize[0] = glutGet(GLUT_WINDOW_WIDTH);
previousSize[1] = glutGet(GLUT_WINDOW_HEIGHT);
oglFullScreen();
}
isFullScreen = !isFullScreen;
}

void oglWindowed(int positionX, int positionY, int width, int height) {
glutReshapeWindow(width, height);
glutPositionWindow(positionX, positionY);
}

void oglFullScreen() {
glutFullScreen();
}
0

В этом случае вы можете добавить static Ключевое слово перед bool сделать эту переменную инициализированной только один раз.

Более безопасный подход был бы сделать fullscreen глобальный, так как static локальные переменные могут быть реализованы по-разному в разных компиляторах и стандартах c ++.

Изменить, чтобы добавить фрагмент кода:

static bool fullscreen = false;

Это должно решить проблему инициализации переменной при каждом вызове функции, и согласно стандарту c ++ 11 должен быть потокобезопасным

(Многие компиляторы могут сказать иначе. Visual Studio поддерживает только эту функцию c ++ 11 в VS2015 в соответствии с принятым ответом на другой вопрос: Является ли статическая инициализация потокобезопасной с VC2010?)

Лучшим вариантом может быть использование глобальной переменной (перенос в класс не подходит для этой цели).

Изменить: Кроме того, несмотря на простоту в синтаксисе, эта функция C ++ 11 является дорогостоящим при частом вызове (см. Сколько стоит поточно-ориентированная локальная статическая переменная в C ++ 11?)

(Клавиша вниз не так часто, как рисование вершин при высоком FPS, хотя … НЕ используйте это, когда критично к производительности …)

0
По вопросам рекламы [email protected]