SDL - TTF - 字体未加载
SDL - TTF - font not loading
我在加载 SDL_TTF 字体时遇到问题。
我的程序太大了,所以有一段代码产生了问题。
TTF_Font *font = NULL;
SDL_Color textColor = {255, 255, 255};
if(SDL_Init() == -1 || TTF_Init() == -1)
return 0;
font = TTF_OpenFont("calibri.ttf", 28);
if(font == NULL)
return 0;
现在请告诉我为什么 TTF_OpenFont 功能不起作用。
font 在函数和程序退出后保持 NULL...
编辑:
我不能 cout 或 printf TTF_GetError() 但我使用断点来查看哪个函数无法正常工作并发现函数 TTF_OpenFont() 每次都返回 null。
(顺便说一句,如果有任何方法可以在屏幕上打印 Erroe,请告诉我)。
TTF_Init() 工作正常。
对于要求单独安装 SDL_TTF 的人:
我在下面写了 link,我在第一个教程中从中学习 SDL,它指导如何安装 SDL 并将其集成到哪个项目中,在第 3 课中是 SDL_IMAGE 扩展库,需要安装分别(我这样做并轻松使用了所有图像功能),在第 7 课中它没有教如何安装 SDL_TFF 而是说要执行与 SDL_IMAGE 相同的步骤,但这次是 SDL_TTf 所以我下载了 SDL_TTF 并安装了,之后你就知道剩下的了....
Windows 8.1,代码块,MinGW32,SDL1
这是我正在从中学习 SDL 的 link
SDL Tutorials
这就是我安装扩展库的方式(SDL_TTF)
Setting Up Extention Library
如果 font
是 NULL
你应该使用 TTF_GetError 来知道哪里出了问题。
如果错误消息是 不透明,您可能需要查看 TTF_OpenFont 来源。
建议:
1) 将此代码替换为 TTF_Init():
if(TTF_Init()==-1) {
printf("TTF_Init: %s\n", TTF_GetError());
exit(2);
}
2) 确保在 之前 调用任何其他 SDL_ttf 函数。
如果您仍有问题,请说明
你的平台(Windows?Linux?)
您是如何安装 TTF 字体的。
3) 另见:https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html
============================================= ======================
很抱歉您仍然无法显示字体。一些额外的建议:
1) 我确定您使用的教程非常好。但是您不能仅仅因为您遵循了所有步骤就假设您没有无意中遗漏某些东西。要解决此问题,您将不得不 "look beyond" 教程。
2) 首先,我们需要确认 TTF_Init() 是否成功。我们必须能够看到 TTF_Init() return 状态和 TTF_GetError() 消息。
问:TTF_Init 的 return 值是多少?
您可以通过多种方式显示 "TTF_GetError":
从命令提示符启动程序 ("cmd"):printf("TTF_Init: %s\n", TTF_GetError());
将错误复制成字符串,在调试器下查看:char[80] msg; strcpy (msg, TTF_GetError());
使用 Win32 MessageBox 在弹出窗口中显示错误:MSDN - MessageBox function
3) 确保您的文件系统中有这些 .dll:
libfreetype*.dll
SDL2_ttf*.dll
zlib*.dll
4) 查看你在文件系统上安装的字体,例如:C:\Windows\Fonts\*.ttf
另见 SDL_ttf - Font directory/Where do fonts go?
问题已解决。
感谢大家抽出时间...
问题是程序无法识别字体(candara)
所以它复制粘贴到我的项目文件夹中。
我知道这已经得到解答,但我 运行 在 Visual Studio 2015 年遇到了与 SDL2_ttf 类似的问题,我想分享我的解决方案以帮助将来的其他人。
我的问题是,当我启动使用 SDLe_ttf 的 SDLe 应用程序时,它无法加载放置在同一目录中的字体。但是当我从命令行手动执行构建可执行文件时,一切都很好。
我认为问题是 Visual Studio 2015 从不同的目录执行构建可执行文件,因为我只使用了字体文件名 (Sans.ttf) 它无法加载字体,因为它处理它作为相对路径。
我的想法是在字体文件名前加上执行目录,可以通过调用SDL_GetBasePath获得。
我在加载 SDL_TTF 字体时遇到问题。
我的程序太大了,所以有一段代码产生了问题。
TTF_Font *font = NULL;
SDL_Color textColor = {255, 255, 255};
if(SDL_Init() == -1 || TTF_Init() == -1)
return 0;
font = TTF_OpenFont("calibri.ttf", 28);
if(font == NULL)
return 0;
现在请告诉我为什么 TTF_OpenFont 功能不起作用。 font 在函数和程序退出后保持 NULL...
编辑: 我不能 cout 或 printf TTF_GetError() 但我使用断点来查看哪个函数无法正常工作并发现函数 TTF_OpenFont() 每次都返回 null。 (顺便说一句,如果有任何方法可以在屏幕上打印 Erroe,请告诉我)。 TTF_Init() 工作正常。 对于要求单独安装 SDL_TTF 的人: 我在下面写了 link,我在第一个教程中从中学习 SDL,它指导如何安装 SDL 并将其集成到哪个项目中,在第 3 课中是 SDL_IMAGE 扩展库,需要安装分别(我这样做并轻松使用了所有图像功能),在第 7 课中它没有教如何安装 SDL_TFF 而是说要执行与 SDL_IMAGE 相同的步骤,但这次是 SDL_TTf 所以我下载了 SDL_TTF 并安装了,之后你就知道剩下的了....
Windows 8.1,代码块,MinGW32,SDL1 这是我正在从中学习 SDL 的 link SDL Tutorials 这就是我安装扩展库的方式(SDL_TTF) Setting Up Extention Library
如果 font
是 NULL
你应该使用 TTF_GetError 来知道哪里出了问题。
如果错误消息是 不透明,您可能需要查看 TTF_OpenFont 来源。
建议:
1) 将此代码替换为 TTF_Init():
if(TTF_Init()==-1) {
printf("TTF_Init: %s\n", TTF_GetError());
exit(2);
}
2) 确保在 之前 调用任何其他 SDL_ttf 函数。
如果您仍有问题,请说明
你的平台(Windows?Linux?)
您是如何安装 TTF 字体的。
3) 另见:https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html
============================================= ======================
很抱歉您仍然无法显示字体。一些额外的建议:
1) 我确定您使用的教程非常好。但是您不能仅仅因为您遵循了所有步骤就假设您没有无意中遗漏某些东西。要解决此问题,您将不得不 "look beyond" 教程。
2) 首先,我们需要确认 TTF_Init() 是否成功。我们必须能够看到 TTF_Init() return 状态和 TTF_GetError() 消息。
问:TTF_Init 的 return 值是多少?
您可以通过多种方式显示 "TTF_GetError":
从命令提示符启动程序 ("cmd"):
printf("TTF_Init: %s\n", TTF_GetError());
将错误复制成字符串,在调试器下查看:
char[80] msg; strcpy (msg, TTF_GetError());
使用 Win32 MessageBox 在弹出窗口中显示错误:MSDN - MessageBox function
3) 确保您的文件系统中有这些 .dll:
libfreetype*.dll
SDL2_ttf*.dll
zlib*.dll
4) 查看你在文件系统上安装的字体,例如:C:\Windows\Fonts\*.ttf
另见 SDL_ttf - Font directory/Where do fonts go?
问题已解决。 感谢大家抽出时间... 问题是程序无法识别字体(candara) 所以它复制粘贴到我的项目文件夹中。
我知道这已经得到解答,但我 运行 在 Visual Studio 2015 年遇到了与 SDL2_ttf 类似的问题,我想分享我的解决方案以帮助将来的其他人。
我的问题是,当我启动使用 SDLe_ttf 的 SDLe 应用程序时,它无法加载放置在同一目录中的字体。但是当我从命令行手动执行构建可执行文件时,一切都很好。
我认为问题是 Visual Studio 2015 从不同的目录执行构建可执行文件,因为我只使用了字体文件名 (Sans.ttf) 它无法加载字体,因为它处理它作为相对路径。
我的想法是在字体文件名前加上执行目录,可以通过调用SDL_GetBasePath获得。