SDL — получить собственное разрешение экрана

Мой код:

  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;
    };
    

Он компилируется нормально, но затем, после компиляции, я получаю эту ужасную ошибку:
Некоторая проблема адреса

В чем причина моей проблемы? Почему я получаю такие странные цифры?

Моя цель — сохранить оригинальное разрешение экрана для дальнейшего использования. (лайк переключение в полноэкранный режим), и я должен сделать это перед звонком SDL_SetVideoMode(), Вот почему это в конструкторе.

4

Решение

У вас есть проблема с вызовом SDL Video Functions до фактической инициализации 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(); сколько хочешь.
Вам придется немного реструктурировать окно вашего класса.

5

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

Чтобы получить Лучший вызов в режиме видео SDL_GetVideoInfo перед настройкой видео (перед звонком SDL_SetVideoMode).

Но вам все равно придется инициализировать подсистему видео перед вызовом (SDL_Init(SDL_INIT_VIDEO)).

2

Я знаю, что это старо, но в коде есть большая ошибка.

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

создает безымянный экземпляр Window, поэтому вызывающий его экземпляр все равно будет иметь неинициализированные переменные. Похоже, вы пытались использовать делегирующие конструкторы, но в этом случае вызов другого конструктора должен быть в списке инициализатора члена.
Увидеть эта страница.

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