5

私のコード:

  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

3 に答える 3

6

実際に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();と、好きなだけ電話をかけることができます。クラスWindowを少し再構築する必要があります。

于 2013-03-22T16:57:16.910 に答える
3

ビデオを設定する前に(呼び出す前に)、最適なビデオモードの呼び出しを取得します。SDL_GetVideoInfoSDL_SetVideoMode

ただし、ビデオサブシステムを呼び出す前に、ビデオサブシステムを初期化する必要があります(SDL_Init(SDL_INIT_VIDEO))。

于 2013-03-22T17:04:25.730 に答える
3

これは古いことは知っていますが、コードに大きな間違いがあります。

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

Windowの名前のないインスタンスを作成するため、それを呼び出すインスタンスにはまだ初期化されていない変数があります。委任コンストラクターを使用しようとしていたようですが、その場合、他のコンストラクターの呼び出しはメンバー初期化子リストに含まれている必要があります。このページを参照してください。

于 2014-03-10T12:45:25.060 に答える