raylib U2 - 绘制文字
绘制文字说难也难,说简单也简单。
有个大前提就是大家要理解char类型的数组如果被识别成字符串,以及char类型的数组又如何存储中文。
本课代码的demo和对应的字体下载地址:绘制文字示例代码
先来看基本的绘制文字
函数原型:
void DrawText(const char *text, int posX, int posY, int fontSize, Color color);
参数作用不用多说了吧。看一下使用代码

效果图:

因为我在text的内容里加了\n换行,所以文本多行显示了。
替换字体
这个方形的字体显示分数的时候还行,但是显示其他的就很挫。

我们来给他换换字体。
这个时候,就必须请出来能设置字体的函数了。
(不知道大家有没有发现,raylib,函数名里带有Ex字样的,都是加强版)
函数原型:
void DrawTextEx(Font font, //字体,需要我们自己加载
const char *text,//要绘制的文字
Vector2 position, //绘制位置,注意是Vector2实例
float fontSize, //字体大小
float spacing, //字间距
Color tint);//颜色
既然多了一个Font 参数,那我们首先就得有这个参数。
再去找找Font相关的函数,
发现也有普通和Ex版本:
//这个常用于英文内容,会加载ASCII码对应的所有字体
Font LoadFont(const char *fileName);
//这个常用于汉字内容,后两个参数是需要绘制的文字的编码信息,防止一下子加载太多,占用太多的资源
Font LoadFontEx(const char *fileName,
int fontSize,
int *codepoints,
int codepointCount);
我们先来使用普通的版本,把英文弄好。

注意,代码其实变化很小。只需要少量的代码就可以加载出指定的字体。

但是这样写有个弊端:加载出来的文字放大的话就变成马赛克了
比如我们把字体大小改成500。


具体的原因参考知乎对raylib加载字体的解释:《raylib绘制中文》

了解就好,不理解也没关系。接下来我们来看解决方案
无马赛克加载字体
话不多说,上效果图,就非常nice。

实现这个功能的关键是下面这一坨代码,替换原来的加载字体。
其原理是这样的:加载字体其实是把字体转换成图片,存放到显卡里头。上面那个简单的加载方式转出来的图片默认是小的,要想解决这个问题,就在加载字体图片的时候,让图片尺寸大一点。

使用的时候,只需要改对应的内容就可以了。注意看下面完整代码中,这一段代码的位置
#include <raylib.h>
#include<bits/stdc++.h>
using namespace std;
int main() {
InitWindow(800, 600,"窗口标题");
SetTargetFPS(60);
//读取字体文件
int fileSize;
unsigned char *fontFileData = LoadFileData("JXZhuoKai2.0.ttf", &fileSize);
//定义要显示的文字
char text[] = "Memories are stars\nthat\nguide us through\nlife's night.";
// 将字符串中的字符逐一转换成Unicode码点,得到码点表
int codepointsCount;
int *codepoints=LoadCodepoints(text,&codepointsCount);
// 读取仅码点表中各字符的字体
Font font = LoadFontFromMemory(".ttf",fontFileData,fileSize,500,codepoints,codepointsCount);
// 释放码点表
UnloadCodepoints(codepoints);
while (!WindowShouldClose()) {
BeginDrawing();
ClearBackground(WHITE);
//把文字画出来
DrawTextEx(font,text,Vector2{20,20},500,10,DARKBLUE);
EndDrawing();
}
//千万记得释放资源
UnloadFont(font);
//关闭窗口
CloseWindow();
return 0;
}
加载中文
加载中文只需要在上面代码的基础上,把text后面的内容替换成中文。

是不是很easy。
再强调一下,学会改这三个地方就行,其他的代码直接复制。

再强调一点
我们需要展示的所有文字都必须在转换Unicode码的时候给出来,否则就会找不到这个字。
通常的做法是:text[]先等于所有要用的文字集合,然后draw的时候重新构建要绘制的文字。

浙公网安备 33010602011771号