这是问题所在的函数
void Video_OpenFont(Video* video, char* path) {
video->font = TTF_OpenFont(path, 0xFFFF);
if (video->font == NULL) {
FATAL("Failed to open font"); // TODO: make a window for this and reset
}
// generate characters
for (uint32_t i = 1; i < ARRAY_LEN(video->characters); ++ i) {
if (i == 173) {
continue; // idk
}
SDL_Color colour = {255, 255, 255, 255};
char asString[2] = {(char) i, 0};
SDL_Surface* textSurface = TTF_RenderText_Solid(
video->font, asString, colour
);
if (textSurface == NULL) {
fprintf(stderr, "TTF error for character %d: %s\n", i, TTF_GetError());
FATAL("Failed to render text");
}
video->characters[i] = SDL_CreateTextureFromSurface(
video->renderer, textSurface
);
if (video->characters[i] == NULL) {
fprintf(stderr, "SDL error: %s\n", SDL_GetError());
FATAL("Failed to create texture");
}
}
}
运行它会显示这个
TTF error for character 1:
source/sdl.c:68: Failed to render text
这是视频结构
typedef struct Video {
SDL_Window* window;
SDL_Renderer* renderer;
TTF_Font* font;
SDL_Texture* characters[256];
} Video;
字符数组就像每个字符的纹理缓存,以使渲染速度更快(我正在制作终端模拟器)
我需要显示错误,以便我知道为什么它无法渲染角色
我不知道您使用的是哪种字体(因为您从未告诉过我们),但我认为假设每种字体都有某种从 1 到最大值的代码值图形是错误的。
它甚至可能没有每个可能的 ASCII 字符的图形。我可以想象一种只包含字母、数字或罗马数字的字体。
您可能必须重组代码来处理这个事实。
您可以通过将这些角色的
NULL
存储在 video->characters[i]
中,并在渲染它们时对其进行处理来做到这一点。