2013-01-10 164 views
0

[已解决]我正在关注this tutorial (video),我现在处于这个状态。我在编译时没有问题,但是当运行程序时,它只是闪烁一秒钟而关闭。所以我运行了调试器,在我的load_image函数中发现了SDL_DisplayFormat的分段错误,当我在加载图像的行注释时它可以正常工作,但我无法找到问题的原因。使用SDL时出现分段错误

[SOLUTION]我还没有填充.bmp文件,这就是为什么SDL_DisplayFormat不起作用。一旦提交,一切都开始奏效。

这里是我的代码:

#include "game.h" 
/*TODO 
*stworzyć plik z blokami "blocks.bmp" 
*stworzyć plik z tlem "background.bmp" 
*uzywac jako tla do obrazkow 000,255,255 
* 
*/ 
game::game() 
{ 
    //zaladowanie ekranu 
    SDL_Init(SDL_INIT_EVERYTHING); 
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGTH, 32, SDL_SWSURFACE); 
    //ladowanei obrazkow 

    //ustawianie polozenia i rozmiaru kamery 
    camera.x = camera.y = 0; 
    camera.w = SCREEN_WIDTH; 
    camera.h = SCREEN_HEIGTH; 
    //inicjalizacja kierunku w kotrym sie poruszamy 
    direction[0] = direction[1] = 0; 
    running = true; 
    block = (load_image("blocks.bmp")); 
    background = (load_image("background.bmp")); 
} 
game::~game() 
{ 
    SDL_FreeSurface(block); 
    SDL_FreeSurface(background); 
    SDL_Quit(); 
} 
SDL_Surface* game::load_image (const char* filename) 
{ 
    SDL_Surface* tmp = SDL_LoadBMP(filename); 
    SDL_Surface* tmp2 = SDL_DisplayFormat(tmp); 
    //do odkomentowania kolorkey na razie zeby sprawdzac kolizje 
    // SDL_SetColorKey(tmp2, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0x00, 0xff, 0xff) 
    SDL_FreeSurface(tmp); 
    return tmp2; 
} 
void game::handleEvents() 
{ 
    SDL_Event event; 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_QUIT: 
       running = false; 
       return; 
      case SDL_KEYDOWN: 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_LEFT: 
         direction[0] = 1; 
         break; 
        case SDLK_RIGHT: 
         direction[1] = 1; 
         break; 
       } 
       break; 
      case SDL_KEYUP: 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_LEFT: 
         direction[0] = 0; 
         break; 
        case SDLK_RIGHT: 
         direction[1] = 0; 
         break; 
       } 
       break; 
     } 
    } 
} 
void game::start() 
{ 
    while(1) 
    { 
     handleEvents(); 
     SDL_Flip(screen); 
    } 
} 
+2

把它扔到那里:'std :: unique_ptr tmp(SDL_LoadBMP(filename),SDL_FreeSurface);' – chris

回答

2

一个提醒前面:提供完整的,最小的代码,包括编译指令。你的函数没有main()函数,类定义也没有了(game.h)。重新编译并在调试器中运行后,我发现第一个SDL_LoadBMP()返回NULL(也许这与你的相同,但这里肯定是我没有相应文件的情况),所以我没有任何线索如果你有同样的问题或没有。

现在,你可以尝试解决这个问题是检查返回值。在这种情况下,试试这个:

SDL_Surface* tmp = SDL_LoadBMP(filename); 
if(!tmp) 
    throw std::runtime_error("SDL_LoadBMP() failed"); 

使用的unique_ptr或一些自定义的包装类,也为了不泄露资源很好的建议。

+0

好的,问题是.bmp文件是空的,一旦我把它放入它们中,上班。 感谢您的提示,我将从现在开始跟踪他们 –