5

我的代码:

  1. 窗口.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. 窗口.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 Video Functions 时遇到问题。

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();地拨打电话。您将不得不稍微重组您的班级窗口。

于 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 回答