SDL2 - 从 1.2 迁移到 2.0 后显示 *.bmp 文件时出现问题,程序构建但运行时显示空白屏幕

SDL2 - Issue with displaying a *.bmp file after migrating from 1.2 to 2.0, program builds but runs with a blank screen

提问人:MattFPy 提问时间:10/26/2023 最后编辑:genpfaultMattFPy 更新时间:10/26/2023 访问量:50

问:

我一直在关注克里斯托弗·赫伯特(Christopher Heberts)洞穴故事的重建 (他的 GitHub 页面:https://github.com/chebert/cavestory-screencast, 和播放列表 https://www.youtube.com/watch?v=IufkC1IRY2Q&list=PL006xsVEsbKjSKBmLu1clo85yLrwjY67X&index=1&pp=iAQB), 为了在更实际的环境中学习 C++,以及如何为每个函数编写具有更多类/标头方法的简单游戏,而不是将所有内容都写在一个庞大的“main.cpp”文件中。

一切顺利,但都是在 SDL 1.2 中完成的,而不是 2.0 中完成的。现在,在最新版本中从头开始一个新项目后,我尝试在屏幕上显示单个位图文件,只需按 Esc 键即可关闭该文件。它构建良好,代码如下图所示:

游戏.cpp:

...
void Game::eventLoop(){
    Graphics graphics;
    SDL_Event event;

    sprite_.reset(new Sprite("sprites/tilesets/dirt_tile.bmp", 0, 0, 128, 128));

    bool running = true;
    while(running){

        const int start_time_ms = SDL_GetTicks();
        while (SDL_PollEvent(&event) ){
            switch (event.type){
            case SDL_KEYDOWN:
                if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE)
                    running = false;
                break;
            default:
                break;
            }
        }

        update();
        draw(graphics);

        const int ms_per_frame = 1000 / kFPS;
        const int elapsed_time_ms = SDL_GetTicks() - start_time_ms;

        if(elapsed_time_ms < ms_per_frame){
            SDL_Delay(ms_per_frame - elapsed_time_ms);
        }
    }
}

...

void Game::draw(Graphics& graphics){

    sprite_->draw(graphics, 400, 300);
    graphics.flip();
}

图形.h:

struct SDL_Surface;
struct SDL_Rect;


struct Graphics{
    typedef SDL_Texture* SurfaceID;

    Graphics();
    ~Graphics();

    void blitSurface(SurfaceID source, SDL_Rect* source_rectangle, SDL_Rect* destination_rectangle);
    void flip();

    private:
        SDL_Window* window_;
        SDL_Renderer* renderer_;
};

#endif // GRAPHICS_H

图形.cpp:

...
Graphics::Graphics(){

    window_ =   SDL_CreateWindow("Swordguy",
                                 SDL_WINDOWPOS_UNDEFINED,
                                 SDL_WINDOWPOS_UNDEFINED,
                                 kScreenWidth, kScreenHeight, 0);
    renderer_ = SDL_CreateRenderer(window_, -1, 0);

}


Graphics::~Graphics(){

    SDL_DestroyWindow(window_);
    SDL_DestroyRenderer(renderer_);

}


void Graphics::blitSurface(SurfaceID source, SDL_Rect* source_rectangle, SDL_Rect* destination_rectangle){

    SDL_RenderCopy(renderer_, source, source_rectangle, destination_rectangle);
}


void Graphics::flip(){

    SDL_RenderPresent(renderer_);
}

精灵.h:

struct Graphics;

struct Sprite{

    Sprite(const std::string& file_path,
           int source_x, int source_y,
           int width, int height);

    // ~Sprite();

    void draw(Graphics& graphics, int x, int y);

    private:
        SDL_Rect source_rect_;
        SDL_Texture* sprite_sheet_;
};

#endif // SPRITE_H

.cpp:

Sprite::Sprite(const std::string& file_path,
               int source_x, int source_y,
               int width, int height){

    SDL_Surface* sprite_sheet_ = SDL_LoadBMP(file_path.c_str() );
    source_rect_.x = source_x;
    source_rect_.y = source_y;
    source_rect_.w = width;
    source_rect_.h = height;

}


/*
Sprite::~Sprite(){

    SDL_FreeSurface(sprite_sheet_);
}
*/


void Sprite::draw(Graphics& graphics, int x, int y){

    SDL_Rect destination_rectangle;
    destination_rectangle.x = x;
    destination_rectangle.y = y;
    graphics.blitSurface(sprite_sheet_, &source_rect_, &destination_rectangle);

}

毕竟,程序以某种方式构建并运行,但屏幕完全空白。

我在这里输入问题之前所做的事情:

  • 检查了 https://wiki.libsdl.org/SDL2/MigrationGuide 的 SDL2/迁移指南,并在 graphics.cpp 中添加了单独的窗口和渲染器函数,并在析构函数中添加了它们的橡皮擦,

  • 在第 9 行的 sprite.cpp 中添加了 SDL_Surface*,因为没有它,SDL_Surface.h 不会将其转换为 SDL_Texture*,

  • 在第 18 行中关闭了用于释放 Sprite 中的表面的析构函数.cpp只是为了检查程序,因为它无法将 SDL_Texture* 转换为 SDL_Surface*,

  • 检查*.bmp文件是否正常,它是否从Lazy Foo的代码中正确加载:https://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php。文件本身也是一个合适的 24 位 *.bmp 文件,

感觉解决方案非常简单,我只是不知道该怎么做了。有什么帮助或提示吗?

C++ 位图 游戏开发 SDL-2

评论

2赞 HolyBlackCat 10/26/2023
请阅读最小可重现示例,并在您的问题中添加一个示例。这里的代码太多了。
1赞 463035818_is_not_an_ai 10/26/2023
当你写一个只显示BMP图像时,你也会出现黑屏吗?无论哪种情况,这都将是我迈向最小可重复示例的开始main
2赞 HolyBlackCat 10/26/2023
在第 9 行添加了 Sprite 中的SDL_Surface.cpp”* 您是否了解这会创建一个与类成员无关的新变量?sprite_sheet_
0赞 MattFPy 10/27/2023
很抱歉回复晚了,但是不,不知道,所以谢谢你把它说出来!关于代码,我将再重写一次,并注意迁移指南。

答: 暂无答案