2011-11-19 126 views
0

我一直在關注LazyFoo的教程一段時間。但我一直無法得到這個初始化一週。我最近回到它,經過錯誤檢查後,我發現窗口正確初始化,但圖像不會加載。這是什麼原因?C++ SDL程序立即終止

#include "SDL/SDL.h" 
    #include <string> 

    //setting screen info 
    const int SCH=640; 
    const int SCW=480; 
    const int BBP=32; 
    const char* name = "TEHGAEM"; 

    // sprite height and width 
    const int SPH=45; 
    const int SPW=45; 

//initilize event 
    SDL_Event event; 

//loading surfaces for screen, sprite, and temp sprite 
    SDL_Surface *screen=NULL; 
    SDL_Surface *sprite=NULL; 
    SDL_Surface *temp = NULL; 
//making class for movable objects 
    class Player 
    { 
     private: 
     int x,y; 
     int xVel,yVel; 
     public: 
     Player(); 
     void show(); 
     void move(); 
     void handle_input(); 
    }; 

//initializing variables 
    Player::Player() 
    { 
     x=0; 
     y=0; 
     xVel=0; 
     yVel=0; 
    } 
//intended to show player picture 
    void Player::show() 
    { 
     SDL_Rect pos; 
     pos.x=x; 
     pos.y=y; 
     SDL_BlitSurface(sprite, NULL, screen, &pos); 
     SDL_UpdateRects(screen, 1, &pos); 
    } 
    //setting input 
    void Player::handle_input() 
    { 
     if (event.type ==SDL_KEYDOWN) 
     { 
      switch (event.key.keysym.sym) 
      { 
       case SDLK_UP: yVel -= SPH /2; break; 
       case SDLK_DOWN: yVel += SPH /2; break; 
       case SDLK_LEFT: xVel -=SPW /2; break; 
       case SDLK_RIGHT: xVel +=SPW /2; break; 
      } 
     } 
     if (event.type == SDL_KEYUP) 
     { 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_UP: yVel += SPH /2; break; 
       case SDLK_DOWN: yVel -= SPH /2; break; 
       case SDLK_LEFT: xVel +=SPW /2; break; 
       case SDLK_RIGHT: xVel -=SPW /2; break; 
      } 
     } 
    } 

    void Player::move() 
    { 
     x=+xVel; 
     y=+yVel; 
     if (x >= SCW) 
     { 
      x-10; 
     } 
     if (y >= SCH) 
     { 
      y-10; 
     } 
    } 

//initializing program 

    bool init() 
    { 
     if (SDL_Init(SDL_INIT_EVERYTHING)==-1) 
     { 
      return false; 
     } 
     screen = SDL_SetVideoMode(SCH,SCW,BBP, SDL_SWSURFACE); 
     if (screen == NULL) 
     { 
      return false; 
     } 
     SDL_WM_SetCaption(name, NULL); 
     return true; 
    } 

//loading images 
    bool somethings() 
    { 
     temp = SDL_LoadBMP("sprite.bmp"); 
     if (temp == NULL) 
     { 
      return false; 
     } 
     sprite = SDL_DisplayFormat (temp); 
     if (sprite ==NULL) 
     { 
      return false; 
     } 
     SDL_FreeSurface(temp); 

     return true; 
    } 

    //clean up function 
    void clean() 
    { 
     SDL_FreeSurface(sprite); 
     SDL_Quit(); 
    } 




    int main(int argc, char* args[]) 
    { 
     Player P1; 
     bool quit; 
     if (init() == false) 
     { 
      return 1; 
     } 

     if (somethings() ==false) 
     { 
      return 1; 
     } 

     while (quit ==false) 
     { 
      while (SDL_PollEvent(&event)) 
      { 
       P1.handle_input(); 
       if (event.type == SDL_QUIT) 
       { 
        quit == true; 
       } 
      } 
      if (SDL_Flip(screen) ==-1) 
      { 
       return 1; 
      } 
      P1.move(); 
      P1.show(); 
     } 
     clean(); 
     return 0; 
    } 

回答

1

這是不完全關係到你的問題,但varible bool quit;主要while(quit == false) { ... }循環之前不被定義爲真或假。這可能會產生未定義的循環行爲。

int main(int argc, char* args[]) 
    { 
     Player P1; 
     bool quit = false; // CHANGE THIS AND SEE WHAT HAPPENS 
     if (init() == false) 
     { 
      return 1; 
     } 

     if (somethings() ==false) 
     { 
      return 1; 
     } 

     while (quit ==false) 
     { 
      while (SDL_PollEvent(&event)) 
      { 
       P1.handle_input(); 
       if (event.type == SDL_QUIT) 
       { 
        quit == true; 
       } 
      } 
      if (SDL_Flip(screen) ==-1) 
      { 
       return 1; 
      } 
      P1.move(); 
      P1.show(); 
     } 
     clean(); 
     return 0; 
    } 

關於圖像不加載,通過你的程序與調試步驟,看你somethings()功能,並按照變量TEMP和精靈。

0

確保您的「sprite.bmp」文件位於此程序的運行目錄中。我測試了它,它適用於我。

而且這沒有任何影響:

 if (x >= SCW) 
     { 
      x-10; 
     } 
     if (y >= SCH) 
     { 
      y-10; 
     } 

你可能想說x -= 10;y -= 10;

這使得你的「玩家」跳回立即原來的位置:

if (event.type == SDL_KEYUP) 
     { 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_UP: yVel += SPH /2; break; 
       case SDLK_DOWN: yVel -= SPH /2; break; 
       case SDLK_LEFT: xVel +=SPW /2; break; 
       case SDLK_RIGHT: xVel -=SPW /2; break; 
      } 
     } 

你可能只需要處理SDL_KEYDOWN事件。

希望有所幫助。

+0

我得到它的工作,我不得不重建文件。 –

0

有很大的機會,你沒有加載位圖。但是,任何您試圖在屏幕上打印並且未加載的內容都可能會終止該應用。