raylib绘图库--瞿华
2022.7.1
知乎 1、raylib绘图库简介
知乎 2、raylib 2d动画/游戏教程(1)动画基本原理
知乎 3、raylib 2d动画/游戏教程(2)坐标系与颜色系统
知乎 4、raylib 2d动画/游戏教程(3)图像文件与图层
知乎 5、raylib 2d动画/游戏教程(4)raylib-drawing库
知乎 6、raylib 2d动画/游戏教程(5)键盘与鼠标输入
知乎 7、raylib 2d动画/游戏教程(6)游戏手柄输入
知乎 8、raylib 2d动画/游戏教程(7)音乐和音效
知乎 9、raylib绘制中文内容
知乎 10、使用raygui绘制控件
知乎 11、raylib 3d绘图基础教程(1)坐标系和摄像机
知乎 12、raylib 3d绘图基础教程(2)网格(Mesh)
知乎 13、raylib 3d绘图基础教程(3)几何变换
知乎 14、raylib 3d绘图基础教程(4)3d模型的载入与绘制
raylib绘制中文内容
1 相关知识
raylib库支持绘制中文内容。但由于raylib的绘制基于OpenGL,所以在文字处理上和直接使用操作系统绘图API的库相比,要复杂一些。
raylib默认字符串使用utf8编码。因此,需要保证编译出来的可执行文件中的所有字符串均以utf8编码。可以在一开始就用utf8作为源文件的字符编码,也可以通过gcc的--exec-charset参数在编译时转码。
raylib加载字体时,直接将每个字符绘制成图片保存在显存中。加载的字符越多,占用的显存就越大。笔者曾尝试载入全部CJK(主要是汉字)字符的字体,其占用了大于1G的显存。
raylib缺省加载的字体中只包含127个ascii码字符的信息。
raylib加载字体时要从磁盘读取字体文件,会占用大量的处理时间。
因此,在raylib中输出中文的基本思路如下:
程序初始化时,读入字体文件内容。
在每个绘制循环中:
将本帧要输出的文字内容保存到字符串中
查找字符串中所有字符对应的unicode码点
使用找到的unicode码点列表读取字体
释放码点列表
输出字符串
释放字体
程序结束时,释放字体文件内容。
2 示例
//因显示中文,本文件须存为UTF-8编码
#include
#include
void log(char *sM)
{
FILE *fp=fopen("2.log","w");
fputs(sM,fp);
fclose(fp);
}
#define FONT_SIZE 48
int main() {
//读取字体文件
InitWindow(800,600,"世界你好");//须在LoadFontFromMemory之前
unsigned int nFileSize;
//行:SimHei.ttf,SourceHanSans-ExtraLight.otf。不行:xp2的simsun.ttc。字母行:times.ttf
unsigned char *pFontFile = LoadFileData("SimHei.ttf", &nFileSize);//将要输出的内容放到字符串中(必须是utf8编码)
char sWordNeed[]="中国a";//加载失败则a的笔画横竖
//将字符串中的字符逐一转换成Unicode码点,得到码点表
int nCode;
int *pCodeNeed=LoadCodepoints(sWordNeed,&nCode);
//仅读取码点表中各字符的字体
Font fontNeed = LoadFontFromMemory(".ttf",pFontFile,nFileSize,FONT_SIZE,pCodeNeed,nCode);
//释放码点表
UnloadFileData(pFontFile);
UnloadCodepoints(pCodeNeed);
//
SetTraceLogLevel(LOG_WARNING);
SetTargetFPS(120);
while (!WindowShouldClose()) {
BeginDrawing();
ClearBackground(WHITE);
DrawTextEx(fontNeed,sWordNeed,(Vector2){50,50},FONT_SIZE,5,RED);
EndDrawing();
}
//释放字体文件内容
UnloadFont(fontNeed);
return 0;
}
程序显示结果
3 问题处理
如果该程序运行显示的结果是空白、横线:程序没有正确读取字体文件。请检查字体文件的路径是否正确。
如果该程序运行显示的结果是若干问号:程序中的字符串并没有以utf8编码。请检查程序的文件编码和编译器的参数设置。