SDL - 在 C 中更新表面

问题描述

我使用 SDL Lib 和 SDL_TTF Lib

我有一个代码可以让你输入文字 然后在我的窗口上显示文本 所以这里的代码

    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,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,&texW,&texH);
    SDL_Rect dstrect = { 200,200,texW,texH };
    SDL_Rendercopy(renderer,texture,&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,&texH);
            SDL_Rect dstrect = { 0,texH };
            SDL_Rendercopy(renderer,&dstrect);
            SDL_RenderPresent(renderer); 
    
    }

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

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

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

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

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


编译器:GCC

操作系统:Windows

解决方法

这是因为一旦您将某些内容输出到屏幕上,它就会一直停留在那里,除非您将其清除或在其上方放置某些内容。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...