SDL - 在 C 中更新表面

SDL - Update Surface in C

我使用 SDL Lib 和 SDL_TTF Lib

我有一个允许您输入文本的代码 然后在我的 window 上显示文字 所以这里的代码

    TTF_Init();
    SDL_Init(SDL_INIT_VIDEO);
    TTF_Font * font = TTF_OpenFont("C:\Windows\Fonts\Arial.ttf", 25);
    SDL_Color color = { 255, 255, 255 };
    SDL_Surface * surface = TTF_RenderText_Solid(font,"", color);

    
    SDL_Window * window = SDL_CreateWindow("SDL_ttf in SDL2",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640,
        480, 0);
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);


    SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface);
    int texW = 200;
    int texH = 200;
    SDL_QueryTexture(texture, NULL, NULL, &texW, &texH);
    SDL_Rect dstrect = { 200, 200, texW, texH };
    SDL_RenderCopy(renderer, texture, NULL, &dstrect);
        
    SDL_RenderPresent(renderer);
    while (program_launched)
    {
        SDL_bool has_type = SDL_FALSE;
        SDL_WaitEvent(&event);
        if(event.type == SDL_QUIT)
            program_launched = SDL_FALSE;
        else if( event.type == SDL_KEYDOWN)
        {
            if(event.key.keysym.sym == SDLK_BACKSPACE && len)
            {
                rep[len - 1] = 0;
                len--;
                has_type = SDL_TRUE;
            }
           
            if(event.key.keysym.sym == SDLK_v && (SDL_GetModState() & KMOD_CTRL) && SDL_HasClipboardText())
            {
                char *tmp = SDL_GetClipboardText();
                size_t l = strlen(tmp);
                size_t l_copy = len + l < LEN_MAX ? l : LEN_MAX - len;
                strncpy(rep + len, tmp, l_copy);
                len += l_copy;
                SDL_free(tmp);
                has_type = SDL_TRUE;
            }
            if(event.key.keysym.sym == SDLK_c && (SDL_GetModState() & KMOD_CTRL))
                SDL_SetClipboardText(rep);
        }
        else if(event.type == SDL_TEXTINPUT)
        {
            size_t l = strlen(event.text.text);
            size_t l_copy = len + l < LEN_MAX ? l : LEN_MAX - len;
            strncpy(rep + len, event.text.text, l_copy);
            len += l_copy;
            has_type = SDL_TRUE;
        }
        if(has_type)

            surface = TTF_RenderText_Solid(font,rep, color);
            texture = SDL_CreateTextureFromSurface(renderer, surface);
            SDL_QueryTexture(texture, NULL, NULL, &texW, &texH);
            SDL_Rect dstrect = { 0, 0, texW, texH };
            SDL_RenderCopy(renderer, texture, NULL, &dstrect);
            SDL_RenderPresent(renderer); 
    
    }

我显示buff(rep)是为了(has-type)

但我的问题是: I can write and display in the window a text

但是如果我退格然后写 The texts overlap because the window, at least the rectangle is not updated

是否可以删除我的window内容(显示buff不重叠)?

我使用这个文档 https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.pdf 我试过这个函数:SDL_UpdateWindowSurface(window); 但没有任何帮助


编译器:GCC

OS: Windows

这是因为一旦你将一些东西输出到屏幕上,它就会一直留在那里,除非你清除它或在它上面放一些东西。

把它想象成一个画家在他的 canvas 上画图。如果你想覆盖一些东西,你必须覆盖以前的形状。

处理这个问题的最简单方法是在每次绘制开始时调用 SDL_RenderClear,它会清除整个屏幕,然后每次渲染时它都不会与之前的内容重叠.