提问人:MattFPy 提问时间:10/26/2023 最后编辑:genpfaultMattFPy 更新时间:10/26/2023 访问量:50
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
问:
我一直在关注克里斯托弗·赫伯特(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 文件,
感觉解决方案非常简单,我只是不知道该怎么做了。有什么帮助或提示吗?
答: 暂无答案
评论
main
sprite_sheet_