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 程序显示结果 3 问题处理 如果该程序运行显示的结果是空白、横线:程序没有正确读取字体文件。请检查字体文件的路径是否正确。 如果该程序运行显示的结果是若干问号:程序中的字符串并没有以utf8编码。请检查程序的文件编码和编译器的参数设置。#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; }