C ++ SDL程序立即终止

时间:2011-11-19 18:56:50

标签: c++ sdl

我一直在关注LazyFoo的教程。但我无法让这一周初始化。我最近回到它,在错误检查后,我发现窗口正确初始化,但图像不会加载。它是什么原因?

 #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;
    }

3 个答案:

答案 0 :(得分:1)

这与您的问题并不完全相关,但在主bool quit;循环之前,varible while( quit == false ) { ... }未定义为true或false。这可能会产生未定义的while循环行为。

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和sprite进行操作。

答案 1 :(得分: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事件。

希望有所帮助。

答案 2 :(得分:0)

很有可能你没有加载位图。但是,您尝试在屏幕上打印但未加载的任何内容都可以终止该应用程序。