c++ SDL程序立即终止

C++ SDL program terminates immediately

本文关键字:终止 程序 SDL c++      更新时间:2023-10-16

我已经跟随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;
    }

这与您的问题并不完全相关,但变量bool quit;在主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。

确保你的"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事件。

希望对你有帮助。

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