前言
上节介绍了怎么利用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是上节创建的渲染指针。注意在使用前记得初始化字体库。
下面是我自己写了个推箱子的游戏,感兴趣的可以交流下
效果展示: