raylib U3 - 计分功能的实现

计分功能的实现依赖于绘制文字,绘制文字的功能一定要会哦。

接下来让我们开始计分。

准备工作

我们在raylib上绘制的是一个char *指向的字符串。所以计分功能的实现自然也是在这个字符串上动手脚。

我们先把计分需要的文字加载出来,然后限定只显示四位

image


注意理解下标:

image

计分算法的实现

首先我们要有一个用来计分的变量,然后把这个变量依次放到对应的位置

image

接下来,把int类型的分数的每一位,放到text对应的位置。看代码:

image

上面是4位分数显示的基本原理。理解的同学可以试试调整成5位,甚至6位,或者说把前面的0替换成空格。再甚至说试试让分数左对齐显示。

不理解的同学……我最后会给出代码的。

模拟分数增加

上面的工作完成之后,接下来只需要让分数从0开始计数就行了。

注意:下面的这种写法适用于随着时间增加分数也增加的规则。如果是条件触发的计分,根据需求修改。懂的都懂。

我把前面的fs变量改成了double类型,方便控制加分的时间间隔。

image

然后在主循环里不停地增加分数。

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("YOUAI_Bold.ttf", &fileSize);
	
	double fs=0;
	
	
	char text[] = "score:0123456789";
	
	
	//因为我们要先加载出所有的字符对应的图片,所以要把所有数字都放进来
	
	int codepointsCount;
	int *codepoints=LoadCodepoints(text,&codepointsCount);
	Font font = LoadFontFromMemory(".ttf",fontFileData,fileSize,50,codepoints,codepointsCount);
	UnloadCodepoints(codepoints);
	
	//这次我们先限定加载4位的分数,所以在4位之后加一个'\0',表示字符串结束
	text[10]='\0';
	
	
	while (!WindowShouldClose()) {
		
		fs+=0.02;
		int t=fs;
		
		//把分数依次放进去
		text[6] = t/1000+'0';
		text[7] = t%1000/100+'0';
		text[8] = t%100/10+'0';
		text[9] = t%10+'0';
		
		
		
		BeginDrawing();
		ClearBackground(WHITE);
		
		//把文字画出来
		DrawTextEx(font,text,Vector2{20,20},50,10,DARKBLUE);
		
		EndDrawing();
	}
	
	//千万记得释放资源
	UnloadFont(font);
	
	//关闭窗口
	CloseWindow();
	return 0;
}

字体与代码下载点击这里

把score替换成中文

实现中文计分的关键是理解一个中文在raylib的char数组中占3位。我用普通的C++代码测试却是占2位。很奇怪。有懂这个问题的大佬解释一下吗?

把这个疑问写出来是希望看到这里的各位要有质疑的精神,我就是用了好长时间去实验2位的中文宽度,怎么都试不出来。后来突然想到了宽度问题,改成3位才终于实现了这个功能。

image

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