我想创建一个单独的函数,我可以在其中发送一个字符串,它会适当地呈现文本,这样我就不需要复制粘贴相同的内容。我想出的功能如下。
void renderText(SDL_Renderer* renderer, char* text,
char* font_name, int font_size,
SDL_Color color, SDL_Rect text_area)
{
/* If TTF was not initialized initialize it */
if (!TTF_WasInit()) {
if (TTF_Init() < 0) {
printf("Error initializing TTF: %s\n", SDL_GetError());
return EXIT_FAILURE;
}
}
TTF_Font* font = TTF_OpenFont(font_name, font_size);
if (font == NULL) {
printf("Error opening font: %s\n", SDL_GetError());
return;
}
SDL_Surface* surface = TTF_RenderText_Blended(font, text, color);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
printf("error creating texture: %s\n", SDL_GetError());
TTF_CloseFont(font);
return;
}
SDL_RenderCopy(renderer, message, NULL, &text_area);
SDL_FreeSurface(surface);
SDL_DestroyTexture(texture);
TTF_CloseFont(font);
}
Run Code Online (Sandbox Code Playgroud)
现在,有时我想将文本与窗口对齐,我需要知道包含文本的表面的高度和宽度,以便我可以使用类似(WINDOW_WIDTH - surfaceText->w) / 2或 的东西(WINDOW_HEIGHT - surfaceText->h) / 2。但是,如果不创建表面,则无法知道包含文本的表面的高度和宽度。如果我最终需要创建曲面,那么此功能的分离将无法实现其目标。
如何找出包含文本的表面的高度和宽度,而无需在 SDL2_ttf 库中实际创建表面?
您可以将字符串传递给TTF_SizeText()函数,其定义为:
int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)
Run Code Online (Sandbox Code Playgroud)
该函数的文档指出:
计算使用字体呈现的 LATIN1 编码文本的最终表面大小。不进行实际渲染,但会进行正确的字距调整以获得实际宽度。h 中返回的高度与使用 3.3.10 TTF_FontHeight 获得的高度相同。
然后,一旦获得了字符串的尺寸,您就可以使用必要的信息调用渲染函数来对齐它。
还有针对不同编码的TTF_SizeUTF8()版本TTF_SizeUNICODE()。