我是SDL的新手。我正在尝试将图像添加到窗口,我已按照本教程:http://lazyfoo.net/SDL_tutorials/lesson02/index.php
我正在使用xcode中的所有代码,当我运行它时,窗口将无法加载。我只是闪过然后消失,我知道我已经完成了我应该做的所有步骤。这是我的代码:
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;
SDL_Surface *load_image(std::string filename)
{
SDL_Surface *loadedImage = NULL;
SDL_Surface *optimizedImage = NULL;
loadedImage = SDL_LoadBMP( filename.c_str() );
if (loadedImage != NULL)
{
optimizedImage = SDL_DisplayFormat(loadedImage);
SDL_FreeSurface(loadedImage);
}
return optimizedImage;
}
void apply_surface(int x, int y, SDL_Surface *source, SDL_Surface *destination)
{
SDL_Rect offset;
offset.x = x;
offset.y = y;
SDL_BlitSurface(source, NULL, destination, &offset);
}
int main( int argc, char* args[] )
{
//Start SDL
SDL_Init( SDL_INIT_EVERYTHING );
//Quit SDL
SDL_Quit();
if (SDL_Init(SDL_INIT_EVERYTHING)==-1)
{
return 1;
}
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
if (screen == NULL)
{
return 1;
}
SDL_WM_SetCaption("Hellow world!", NULL);
message = load_image("images.bmp");
background = load_image("images.bmp");
apply_surface(0, 0, background, screen);
apply_surface(180, 140, message, screen);
return 0;
}
答案 0 :(得分:1)
您在主函数中过早地调用了SDL_Quit()
。此函数关闭所有SDL子系统,而应在程序结束时调用。
如果您希望窗口保持不变,直到您明确关闭它,请添加一个循环,如下所示:
int main() {
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
return 1;
}
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
if (!screen) {
return 1;
}
bool running = true;
SDL_Event event;
while (running) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
running = false;
}
}
}
SDL_Quit();
return 0;
}
当某些事件发生时,例如窗口关闭时,您可以将运行设置为false。
答案 1 :(得分:-1)
你已经把SDL_Quit();在你的计划的一开始。这就像放回0;在你所有的代码之前。它在读取该行时关闭。为了避免这种情况,你应该制作一个循环,当它按下窗口顶部的'x'时会中断。