我想创建一个单独的函数,我可以发送一个字符串,它将适当地呈现文本,这样我就不需要复制粘贴相同的东西。我想出的功能如下。
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);
}
现在,有时我想将文本与窗口对齐,我需要知道包含文本的表面的高度和宽度,以便我可以使用像(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)
这个函数的documentation说明:
计算使用font呈现的LATIN1编码文本的结果表面大小。没有进行实际渲染,但是要进行正确的字距调整以获得实际宽度。以h返回的高度与使用3.3.10 TTF_FontHeight时的高度相同。
然后,一旦获得了字符串的尺寸,就可以使用必要的信息调用渲染函数来对齐它。
还有TTF_SizeUTF8()
和TTF_SizeUNICODE()
版本用于不同的编码。