SDL2的学习之路<三>显示文字

前言

上节介绍了怎么利用SDL接口去显示图片,这节主要介绍怎么去显示文本信息。


SDL2展示文字需要在官网下载SDL2_ttf的扩展库。这个第一节已经讲过了。
使用时需要先初始化库,使用结束时释放库资源。
TTF_Init(); //初始化库

TTF_Quit(); //释放

显示文字的基本步骤:
1、打开字体
首先需要有字体库,这个可以在windows系统里找到很多的字体库,比如这里用的就是msyh.ttf这个字体库。
API:*TF_Font * SDLCALL TTF_OpenFont(const char file, int ptsize);
第一个参数是字体所在的路径,第二个参数是字体大小。成功打开会返回一个字体结构指针。
API: **SDL_Surface * SDLCALL TTF_RenderUTF8_Blended(TTF_Font font, const char text, SDL_Color fg);
根据字体,文字和颜色创建surface表面。这里注意这个地方是有三个api可以来创建surface表面的,这里用的是带utf8的,如果传入中文的编码不是utf8格式的会导致显示的字体乱码问题,c++的转码确实是非常麻烦的一件事情,如果象要方便显示中文,可以用SDL_Surface * SDLCALL TTF_RenderUNICODE_Blended(TTF_Font *font,const Uint16 *text, SDL_Color fg);这里传入的文字用wstring就好了。
API:SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface);
根据surface表面创建纹理。SDL的展示是基于纹理的,需要将上面创建的表面转化成纹理才能显示。
API:**int SDLCALL TTF_SizeUTF8(TTF_Font *font, const char *text, int w, int h);
这个是根据文字和字体来计算文字的宽和高的。当然也不是必须的,因为后面展示的时候也是跟上节显示图片一样调用显示纹理的接口,那个地方需要传入纹理的高度和宽度,当然也可以根据需求自己在那里更改纹理大小,只是不建议那么做,毕竟会导致纹理拉伸变形。需要注意的是,如果上面创建表面的时候是用的unicode接口,这个地方就需要调用TTF_SizeUNICODE去计算字体的大小。
API:*int SDLCALL TTF_GetFontStyle(const TTF_Font font);
获取字体当前的风格类型。
#define TTF_STYLE_NORMAL 0x00 // 正常。
#define TTF_STYLE_BOLD 0x01 // 加粗
#define TTF_STYLE_ITALIC 0x02 // 倾斜
#define TTF_STYLE_UNDERLINE 0x04 // 下划线
#define TTF_STYLE_STRIKETHROUGH 0x08 // 删除线
API:*void SDLCALL TTF_SetFontStyle(TTF_Font font, int style);
设置字体风格。
主要就是上面几个函数,后面就是跟上节显示纹理一样去展示纹理了。

代码展示:

bool displayText(std::string text, std::string font, int height, SDL_Point point)
{
	TTF_Font * pFont = TTF_OpenFont(font.c_str(), height);
	if (pFont == nullptr) return false;
	SDL_Color color = { 255,255,255,255 };
	SDL_Surface * surface = TTF_RenderUTF8_Blended(pFont, text.c_str(), color);
	SDL_Texture * texture = SDL_CreateTextureFromSurface(m_render, surface);
	int w = 0, h = 0;
	TTF_SizeUTF8(pFont, text.c_str(), &w, &h);
	SDL_Rect des = { point.x, point.y, w, h };
	SDL_RenderCopy(m_render, texture, NULL, &des);
	SDL_FreeSurface(surface);
	SDL_DestroyTexture(texture);
	return true;
}

这里的m_render是上节创建的渲染指针。注意在使用前记得初始化字体库。
下面是我自己写了个推箱子的游戏,感兴趣的可以交流下
效果展示:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值