我的代码:
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");
}
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()
之前执行此操作。这就是它在构造函数中的原因。
答案 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。