SDL_LoadBMP无法打开BMP文件及SDL_RenderCopy报错无效纹理问题求助
问题根因
SDL_LoadBMP加载失败的核心问题是你传入的/images/character.bmp是系统根目录绝对路径,绝大多数场景下项目资源不会放在系统根目录,SDL找不到对应文件- 后续的纹理无效、
SDL_RenderCopy报错都是BMP加载失败的连锁问题:空的surface创建出的texture自然为空,传入空纹理给渲染拷贝函数就会触发参数合法性报错
修复方案
- 修正资源路径写法
- 如果
images文件夹和编译后的可执行文件在同级目录,把路径改为"images/character.bmp"(去掉开头的斜杠,使用相对路径),Windows平台也可以写"./images/character.bmp"明确指代当前运行目录 - 调试阶段可以调用系统接口打印当前工作目录确认路径是否匹配,Linux/macOS用
getcwd、Windows用GetCurrentDirectory即可
- 如果
- 补充必要的代码逻辑
- surface转成纹理后不再需要使用,要调用
SDL_FreeSurface(surf)释放内存避免泄漏 - 渲染循环要增加事件处理逻辑,否则窗口会触发系统无响应判定
- surface转成纹理后不再需要使用,要调用
修改后参考代码
SDL_Window *window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 720, SDL_WINDOW_SHOWN); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); // 修正为相对路径 SDL_Surface *surf = SDL_LoadBMP("images/character.bmp"); if (surf == NULL) { fprintf(stderr, "Load bmp failed: %s\n", SDL_GetError()); exit(1); } SDL_Texture *text = SDL_CreateTextureFromSurface(renderer, surf); // 释放不再使用的surface SDL_FreeSurface(surf); if (text == NULL) { fprintf(stderr, "Creating texture failed: %s\n", SDL_GetError()); exit(1); } SDL_Rect rect = {500, 600, 330, 450}; int quit = 0; SDL_Event e; while (!quit) { // 新增事件处理,响应窗口关闭操作 while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = 1; } } SDL_RenderClear(renderer); if (SDL_RenderCopy(renderer, text, NULL, &rect) < 0) { printf("Error in RenderCopy(): %s\n", SDL_GetError()); } SDL_RenderPresent(renderer); }
内容的提问来源于stack exchange,提问作者gooosz
相关产品推荐
相关产品推荐

