SDL程序创建纹理矩形运行时出现黑屏问题求助
SDL程序黑屏问题的解决方法
核心问题分析
你的代码存在资源创建顺序颠倒的致命错误:
- 调用
SDL_CreateTextureFromSurface创建纹理时,renderer还未初始化(值为nullptr),导致纹理创建失败,最终渲染无有效内容。 - 窗口和渲染器的创建步骤被放在纹理创建之后,完全不符合SDL的工作流程。
另外还有两个潜在问题:
- 缺少资源加载/创建失败的错误检查,无法快速定位问题。
- Xcode项目中,资源文件路径可能并非
./Images/smile.bmp,需确保图片已正确添加到项目的Copy Bundle Resources中。
修复后的完整代码
#include <SDL2/SDL.h> #include "dinoHeader.h" int main(int argc, const char * argv[]) { if(SDL_Init(SDL_INIT_EVERYTHING) < 0){ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL初始化失败: %s", SDL_GetError()); return 1; } SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; // 第一步:先创建窗口和渲染器 window = SDL_CreateWindow("Dino", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, ScreenWidth, ScreenHeight, SDL_WINDOW_OPENGL); if(!window){ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "窗口创建失败: %s", SDL_GetError()); SDL_Quit(); return 1; } renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if(!renderer){ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "渲染器创建失败: %s", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); return 1; } // 第二步:加载图片表面并创建纹理 SDL_Surface* surface = SDL_LoadBMP("./Images/smile.bmp"); if(!surface){ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "图片加载失败: %s", SDL_GetError()); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 1; } SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); if(!texture){ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "纹理创建失败: %s", SDL_GetError()); SDL_FreeSurface(surface); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 1; } SDL_FreeSurface(surface); SDL_Rect rect; rect.w = 100; rect.h = 100; rect.x = (ScreenWidth / 2) - (rect.w / 2); rect.y = (ScreenHeight / 2) - (rect.h / 2); bool game = true; while (game) { SDL_Event event; while(SDL_PollEvent(&event)){ if(event.type == SDL_QUIT){ game = false; } } SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, &rect); SDL_RenderPresent(renderer); } // 按创建逆序销毁资源 SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
额外注意事项
- Xcode资源路径检查:右键项目 -> Build Phases -> Copy Bundle Resources,确保
smile.bmp在列表中。若路径无效,可尝试直接使用文件名(如"smile.bmp"),或通过Xcode文件引用设置正确相对路径。 - 资源销毁顺序:销毁资源需遵循“创建逆序”,先销毁纹理,再销毁渲染器,最后销毁窗口,避免悬空指针问题。
内容的提问来源于stack exchange,提问作者Holo Graphic
相关产品推荐
相关产品推荐

