raylib U2 - 绘制文字

绘制文字说难也难,说简单也简单。
有个大前提就是大家要理解char类型的数组如果被识别成字符串,以及char类型的数组又如何存储中文。

本课代码的demo和对应的字体下载地址:绘制文字示例代码

先来看基本的绘制文字

函数原型:
void DrawText(const char *text, int posX, int posY, int fontSize, Color color);

参数作用不用多说了吧。看一下使用代码

image

效果图:
image
因为我在text的内容里加了\n换行,所以文本多行显示了。

替换字体

这个方形的字体显示分数的时候还行,但是显示其他的就很挫。
image

我们来给他换换字体。

这个时候,就必须请出来能设置字体的函数了。
(不知道大家有没有发现,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);

我们先来使用普通的版本,把英文弄好。

image

注意,代码其实变化很小。只需要少量的代码就可以加载出指定的字体。
image
但是这样写有个弊端:加载出来的文字放大的话就变成马赛克了
比如我们把字体大小改成500。
image
image

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

了解就好,不理解也没关系。接下来我们来看解决方案

无马赛克加载字体

话不多说,上效果图,就非常nice。
image

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

image

使用的时候,只需要改对应的内容就可以了。注意看下面完整代码中,这一段代码的位置

#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后面的内容替换成中文。
image

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

再强调一点

我们需要展示的所有文字都必须在转换Unicode码的时候给出来,否则就会找不到这个字。

通常的做法是:text[]先等于所有要用的文字集合,然后draw的时候重新构建要绘制的文字。

posted @ 2025-04-24 09:01  一亩食堂  阅读(474)  评论(0)    收藏  举报