我有一个带有函数TextOut
的代码,该代码每次都会在窗口上延迟写入一个字符。一切正常,但是我的程序仅将字符串的一部分写入窗口。但是有时程序会编写整个文本。
此函数从char创建wchar
char* cts(char c)
{
char *ptr = (char*)malloc(2 * sizeof(char));
ptr[0] = c;
ptr[1] = '\0';
return ptr;
}
void TextOut(SDL_Renderer *ren, TTF_Font *f)
{
SDL_Surface *sur;
SDL_Texture *tex;
static SDL_Rect rect;
static int32_t x;
//Checking if string is end
if (OUT_STRING[x] == '\0') return;
//Get a wide char from string
char *temp = cts(OUT_STRING[x]);
//Get the size of font
TTF_SizeText(f, temp, &rect.w, &rect.h);
sur = TTF_RenderText_Blended(f, temp, color)
free(temp);
tex = SDL_CreateTextureFromSurface(ren, sur);
SDL_RenderCopy(ren, tex, NULL, &rect);
SDL_RenderPresent(ren);
rect.x += rect.w;
x++;
SDL_FreeSurface(sur);
SDL_Delay(50);
}
int main(int argc, char* argv[])
{
/*
Initialization of Window, Renderer, Font and other things
*/
OUT_STRING = "We are waiting";
while (!quit)
{
while (SDL_PollEvent(&e) != 0)
{
TextOut(renderer, font);
if (e.type == SDL_QUIT) quit = true;
}
}
return 0;
}
答案 0 :(得分:2)
您描述的问题归因于事件循环-您在此处调用了render函数。显示窗口时,会生成几个事件(SDL_WINDOWEVENT_EXPOSED等),因此渲染函数称为“多次”,但不足以容纳“整个”文本。当更多事件到达时(鼠标移动,按键按下,窗口操纵等),您可以看到更多。如果这是不良行为,则应使用事件循环进行事件处理,例如:
while (!quit)
{
while (SDL_PollEvent(&e) != 0)
{
if (e.type == SDL_QUIT) quit = true;
}
TextOut(renderer, font);
}
在显示所有字符后如何继续绘制还是为什么需要malloc(不需要)是令人怀疑的。
答案 1 :(得分:1)
对我来说,全文始终出现,因此我无法测试这些改进是否可以解决您的问题,但它们绝对是您的代码问题。
您应该释放malloc
内cts
分配的内存,例如,您可以这样操作:
char* temp = cts(OUT_STRING[x]);
TTF_SizeText(f, temp, &rect.w, &rect.h);
free(temp);
在检查退出事件是否发生时,请勿使用分配而不是比较。正确的方法是:
if (e.type == SDL_QUIT) quit = true;
在检查是否已到达char
数组的末尾时,请勿使用NULL
。改为这样:
if (OUT_STRING[x] == '\0') return;