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 <raylib.h>
#include <stdio.h>
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编码。请检查程序的文件编码和编译器的参数设置。