SDL - 获取原生屏幕分辨率

sja*_*rni 4 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");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    };
    
    Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是在编译之后,我得到了这个丑陋的错误: 一些解决问题

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

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

小智 5

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

SDL_Init( SDL_INIT_EVERYTHING )
Run Code Online (Sandbox Code Playgroud)

一直被称为

SDL_GetVideoInfo(); 
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你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
Run Code Online (Sandbox Code Playgroud)

所以解决方案很简单; SDL_Init( SDL_INIT_EVERYTHING )在程序开始时立即拨打电话,然后您可以随意拨打电话SDL_GetVideoInfo();.您将不得不稍微重构您的类窗口.