3

我不明白为什么当我按“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;
4

7 回答 7

4

在这个方法的顶部,我设置了 bool fullscreen = false;

每次你按下一个键,GLUT 都会调用你的键盘处理程序。在键盘处理程序的顶部,您创建一个bool名为的变量fullscreen并将其值设置为false. 无论您是否处于全屏模式,都会发生这种情况。每按一次键,就会发生这种情况。

如果您想保留一个实际跟踪您当前是否全屏的布尔变量,那么您需要使用全局. 而且你不需要函数开始时设置它。您在创建窗口时设置一次,仅在更改窗口的全屏状态时再次设置。

于 2012-10-26T09:43:23.437 回答
3

恢复原始窗口大小

... 将 ReshapeWindow 和 PositionWindow 的调用顺序切换为

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

否则它将回到窗口模式,但不适应您指定的窗口大小!

于 2013-08-05T14:51:30.047 回答
1

问题不在您上面发布的代码中,因为根据glutFullScreen 规范,一旦调用 glutReshapeWindow 或 glutPositionWindow,窗口应该退出全屏模式。

在这个方法的顶部,我设置了 bool fullscreen = false;

我敢打赌,您将其设置在同一个函数中(而不是作为全局变量),当您按 f 时,该变量始终为假

于 2012-10-26T09:48:21.167 回答
0

您必须定义一个全局变量,而不是在方法的开头定义 bool。否则每次调用该方法时,它会将全屏布尔值设置为 0,并认为它不是处于全屏模式。此外,您可能不想接受 euphrat 的回答,他对方法组织提出了一个有效的观点。

于 2014-04-08T00:28:39.520 回答
0

试试这个:

case 'f': //toggle screenmode
    fullScreen = !fullScreen;
    if (fullScreen) {
        glutFullScreen();
    } else {
        glutReshapeWindow(1200, 900);
        glutPositionWindow(0,0);
    }
    break;
于 2017-01-02T15:50:16.847 回答
0

虽然它可能无法直接回答这个问题,但我发现它是发布全屏和退出源代码的好地方。

使用 <GL/glut.h> 切换和恢复全屏

我的游戏.c

...
glutSpecialFunc(handleSpecial);

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

如果您希望改为响应键盘事件 ( glutKeyboardFunc),请确保将以下签名更改oglHandleFullScreen(unsigned char key, int x, int y).

全屏.h

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

全屏.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();
}
于 2017-10-28T16:28:19.360 回答
0

在这种情况下,您可能希望在static之前添加一个关键字,bool以使该变量仅初始化一次。

更安全的方法是fullscreen全局化,因为static局部变量可能在编译器和 c++ 标准中以不同方式实现。

编辑以添加代码片段:

static bool fullscreen = false;

这应该解决每次调用函数时初始化变量的问题,并且按照 c++11 标准应该是线程安全的

(许多编译器可能会另有说法。根据另一个问题的接受答案:Visual Studio 仅支持 VS2015 中的 c++11 的此功能:Is static init thread-safe with VC2010?

更好的选择可能是使用全局变量(包装到一个类中不适合这个目的)。

编辑:此外,尽管语法简单,但这个 c++11 功能在频繁调用时代价高昂。(请参阅C++11 中线程安全局部静态变量初始化的成本?

(但是,按下键并不像在高 FPS 下绘制顶点那样频繁......当性能关键时不要使用它......)

于 2018-12-22T14:50:49.303 回答