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

无法将SDL_Surface绘制到另一个Surface之上的技术问题求助

问题分析与修复方案

你的代码存在几个关键问题,导致彩色方块无法正常显示,以下是具体问题和修复步骤:

主要问题点

  • 方块表面未填充颜色:创建block表面后没有为其填充任何颜色,默认与黑色背景一致,因此无法被看到。
  • SDL_CreateRGBSurface掩码参数错误:32位表面的RGBA掩码参数顺序和取值不正确,导致颜色渲染异常。
  • 冗余赋值笔误:block = block = ...的写法冗余且存在潜在风险。
  • 缺失关键错误检查:窗口、表面创建等操作未检查是否成功,出错时无法及时定位问题。
  • 退出逻辑不完整:仅处理ESC按键退出,未处理窗口关闭事件,可能导致资源泄漏。

修复后的代码

#include <iostream>
#include <string>
#include <SDL.h>

using namespace std;

int main(int argc, char** args)
{
    // 初始化SDL并检查结果
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        cout << "SDL初始化失败: " << SDL_GetError() << endl;
        return 1;
    }
    else
    {
        cout << "SDL初始化成功" << endl;
    }

    // 创建窗口并检查是否成功
    SDL_Window * window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000,600, SDL_WINDOW_BORDERLESS);
    if (!window) {
        cout << "窗口创建失败: " << SDL_GetError() << endl;
        SDL_Quit();
        return 1;
    }

    // 获取窗口表面并检查结果
    SDL_Surface * winSurface = SDL_GetWindowSurface(window);
    if (!winSurface) {
        cout << "获取窗口表面失败: " << SDL_GetError() << endl;
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    // 填充窗口背景为黑色
    SDL_FillRect(winSurface, NULL, SDL_MapRGB(winSurface->format, 0,0,0));

    // 创建方块表面,修正掩码参数,移除冗余赋值
    SDL_Surface * block = SDL_CreateRGBSurface(0, 100, 100, 32, 
                                               0xFF000000, // 红色通道掩码
                                               0x00FF0000, // 绿色通道掩码
                                               0x0000FF00, // 蓝色通道掩码
                                               0x000000FF); // Alpha通道掩码
    if (!block) {
        cout << "创建方块表面失败: " << SDL_GetError() << endl;
        SDL_FreeSurface(winSurface);
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    // 给方块填充颜色(示例为绿色,可自行修改RGB值)
    SDL_FillRect(block, NULL, SDL_MapRGB(block->format, 0, 255, 0));

    // 设置方块的位置与大小
    SDL_Rect dest1;
    dest1.x = 200;
    dest1.y = 200;
    dest1.h = 100;
    dest1.w = 100;
    // 将方块绘制到窗口表面并检查结果
    if (SDL_BlitScaled(block, NULL, winSurface, &dest1) != 0) {
        cout << "绘制方块失败: " << SDL_GetError() << endl;
    }

    // 更新窗口显示内容
    SDL_UpdateWindowSurface(window);

    SDL_Event event;
    bool run = true;
    while (run)
    {
        while (SDL_PollEvent(&event))
        {
            // 处理ESC按键退出
            if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym == SDLK_ESCAPE)
                {
                    run = false;
                }
            }
            // 处理窗口关闭事件(即使是无边框窗口也可能触发)
            else if (event.type == SDL_QUIT)
            {
                run = false;
            }
        }
    }

    // 统一释放资源,覆盖所有退出场景
    SDL_FreeSurface(block);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

关键修改说明

  1. 填充方块颜色:添加SDL_FillRect(block, NULL, SDL_MapRGB(block->format, 0, 255, 0)),为方块设置可见颜色。
  2. 修正表面掩码参数:使用标准32位ARGB掩码,确保颜色能正确渲染。
  3. 添加错误检查:对SDL初始化、窗口创建、表面创建、绘制操作均添加错误检查,便于问题排查。
  4. 完善退出逻辑:添加SDL_QUIT事件处理,确保窗口关闭时能正常退出,并统一在循环结束后释放资源,避免内存泄漏。
  5. 移除冗余赋值:将SDL_Surface * block = block = ...改为规范的初始化写法。

内容的提问来源于stack exchange,提问作者czmead

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:44