You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:15:26