SDL_BlitSurface显示BMP黑屏问题求助(附代码)
SDL显示BMP黑屏问题修复
核心问题分析
你的代码存在两个关键错误导致黑屏:
局部变量覆盖全局变量
main函数里重新定义了SDL_Window* window和SDL_Surface* screenSurface局部变量,直接覆盖了init()函数初始化的全局同名变量。后续调用SDL_UpdateWindowSurface(window)时,这里的window是未初始化的NULL,根本无法更新窗口表面。Blit参数使用错误
SDL_BlitSurface的第二个参数是源图片的裁剪矩形,第四个是目标窗口的位置矩形。你把同一个area同时传给这两个参数,若BMP图片尺寸小于250x250,会导致源裁剪区域超出图片范围,无法正确绘制内容。
修复后的代码
#define SDL_MAIN_HANDLED #include <iostream> #include "SDL/include/SDL2/SDL.h" const int screenWidth = 640; const int screenHeight = 480; SDL_Window* window = NULL; SDL_Surface* screenSurface = NULL; SDL_Surface* gHelloWorld = NULL; bool init() { bool good = true; if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::cout << "ERROR: Failed to initialize SDL " << SDL_GetError() << "\n"; good = false; } else { window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screenWidth, screenHeight, SDL_WINDOW_SHOWN); if (window == NULL) { std::cout << "ERROR: Failed to create window " << SDL_GetError() << "\n"; good = false; } else { screenSurface = SDL_GetWindowSurface(window); } } return good; } void close() { SDL_FreeSurface(gHelloWorld); gHelloWorld = NULL; SDL_DestroyWindow(window); window = NULL; SDL_Quit(); } bool loadMedia() { bool ok = true; gHelloWorld = SDL_LoadBMP("hello_world.bmp"); if (gHelloWorld == NULL) { std::cout << "ERROR: Failed to load image " << SDL_GetError() << "\n"; ok = false; } else { std::cout << "Loaded successfully\n"; } return ok; } int main() { bool Init = init(); if (Init) { bool loadMed = loadMedia(); if (loadMed) { // 仅设置目标位置,尺寸由源图片自动匹配 SDL_Rect destRect = {30, 30, 0, 0}; // 源矩形传NULL表示绘制整张图片 SDL_BlitSurface(gHelloWorld, NULL, screenSurface, &destRect); // 使用全局window变量更新窗口表面 SDL_UpdateWindowSurface(window); SDL_Event e; bool quit = false; while (!quit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } } } } } close(); return 0; }
额外注意事项
- 确保
hello_world.bmp路径正确:CMake项目中需将图片放到可执行文件输出目录,或在代码中使用绝对路径。 - 检查SDL库链接:CMake配置需正确找到SDL2库,例如使用
find_package(SDL2 REQUIRED)和target_link_libraries(你的可执行文件名 SDL2::SDL2)。
内容的提问来源于stack exchange,提问作者Solirous
相关产品推荐
相关产品推荐

