2011-11-19 110 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

有很大的机会,你没有加载位图。但是,任何您试图在屏幕上打印并且未加载的内容都可能会终止该应用。