SDL - 获取原生屏幕分辨率

时间:2013-03-22 16:37:08

标签: c++ sdl fullscreen screen-resolution

我的代码:

  1. window.cpp

    Window::Window(int w, int h, const char *title, const char *icon)
    {
        height = h;
        width = w;
    
        if(SDL_Init( SDL_INIT_EVERYTHING ) == 0)
        {
            SDL_WM_SetCaption(title, NULL);
            SDL_WM_SetIcon(SDL_LoadBMP(icon),NULL);
    
            screen = SDL_SetVideoMode(width, height, 32,
                         SDL_SWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
            if(screen == NULL)
            {
                running = false;
                return;
            }
            fullscreen = false;
        }
        else
            running = false;
            return;
    }
    
    Window::Window()
    {
        const SDL_VideoInfo* info = SDL_GetVideoInfo();
        screenWidth = info->current_w;
        screenHeight = info->current_h;
        Window(640, 480, "Flatgu game", "rsc/img/icon.bmp");
    }
    
  2. window.h中

    class Window
    {
    public:
        Window();
        ~Window();
    
        int getWidth() {return width;}
        int getHeight() {return height;}
        bool isFullscreen() {return fullscreen;}
    
        void toggleFullscreen();
    
    private:
        Window(int w, int h, const char *title, const char *icon);
    
        bool fullscreen, running;
        int height, width, screenWidth, screenHeight;
        SDL_Surface *screen;
    };
    
  3. 它编译得很好,但是在编译之后,我收到了这个丑陋的错误: Some address problem

    我的问题是什么原因?为什么我会得到如此奇怪的数字?

    我的目标是存储原始屏幕分辨率以供进一步使用(例如切换到全屏),我必须在调用SDL_SetVideoMode()之前执行此操作。这就是它在构造函数中的原因。

3 个答案:

答案 0 :(得分:5)

在实际初始化SDL之前,您在调用SDL视频功能时遇到问题。

SDL_Init( SDL_INIT_EVERYTHING )
必须在

之前将

称为

SDL_GetVideoInfo(); 

在您的情况下,请先致电SDL_GetVideoInfo();

const SDL_VideoInfo* info = SDL_GetVideoInfo();   //<-- calls SDL_GetVideoInfo();   
screenWidth = info->current_w;
screenHeight = info->current_h;
Window(640, 480, "Flatgu game", "rsc/img/icon.bmp");    //<-- initializes SDL

所以解决方案很简单;在您的计划开始时立即拨打电话SDL_Init( SDL_INIT_EVERYTHING ),然后您可以根据需要拨打SDL_GetVideoInfo();。 您将不得不稍微重构您的类窗口。

答案 1 :(得分:2)

要在设置视频之前(在致电SDL_GetVideoInfo之前)获取最佳视频模式,请致电SDL_SetVideoMode

但是在调用之前你仍然必须初始化视频子系统(SDL_Init(SDL_INIT_VIDEO))。

答案 2 :(得分:2)

我知道这是旧的,但代码中存在一个很大的错误。

Window(640, 480, "Flatgu game", "rsc/img/icon.bmp");

创建一个Window的无名实例,因此调用它的实例仍将具有未初始化的变量。看起来您正在尝试使用委托构造函数,但在这种情况下,对其他构造函数的调用必须位于成员初始化列表中。 请参阅this page