问题描述
我使用 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
我使用这个文档 https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.pdf 我试过这个函数:SDL_UpdateWindowSurface(window); 但没有任何帮助
编译器:GCC
操作系统:Windows
解决方法
这是因为一旦您将某些内容输出到屏幕上,它就会一直停留在那里,除非您将其清除或在其上方放置某些内容。
把它想象成一个画家在他的画布上绘制东西。如果你想覆盖一些东西,你必须覆盖之前的形状。
解决这个问题的最简单方法是在每次绘制开始时调用 SDL_RenderClear,它会将整个屏幕清除干净,然后每次渲染时它都不会与之前的内容重叠。