简体   繁体   中英

C++ SDL program terminates immediately

I've been following LazyFoo's tutorial for a while. But I haven't been able to get this to initialize a week a go. I went back to it recently, after error checking, I found it that the window initializes properly, but the images won't load. What is the reason for it?

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

This isn't completely related to your problem but the varible bool quit; isn't defined as true or false before the main while( quit == false ) { ... } loop. This could produce undefined while loop behavior.

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

About the images not loading, step through your program with a debugger and watch your somethings() function and follow the variables temp and sprite.

Make sure your "sprite.bmp" file is located in the running directory of this program. I tested it and it works for me.

Also this has no effect:

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

You probably wanted to say x -= 10; and y -= 10; .

This makes your 'player' jump back to the original position immediately:

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

You probably only need to handle SDL_KEYDOWN event.

Hope that helps.

There are big chances that you aren't loading the bitmap. But anything that you are trying to print on the screen and wasn't loaded can terminate the app.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM