1.简介
SDL本身没有显示文字功能,它需要用扩展库SDL_ttf来显示文字。ttf是True Type Font的缩写,ttf是Windows下的缺省字体,它有美观,放大缩小不变形的优点,因此广泛应用很多场合。
使用ttf库的第一件事要从Windows的字库下拷贝出一个字库出来,最好是中文字体,这样可以同时支持英文和中文显示。它一般在c:windowsfonts 目录下面。比如simhei.ttf 就是仿黑体的字库,将这个文件拷贝到你的源文件目录下。
要使用SDL_ttf库首先要下载该扩展库:为了方便,我使用的开发环境是Windows。
下载地址:Releases · libsdl-org/SDL_ttf · GitHub
我使用的是2.20.0的版本,下载我框出来的那个zip包。
2.配置环境
先拷贝SDL_ttf的头文件和库文件到目的目录下,如下图所示:
VS的配置请看SDL2 简单介绍以及Windows开发环境搭建-CSDN博客
目录4.配置,跟配置SDL库一样的配置。
3.使用步骤
SDL_ttf的编程的核心数据结构是 TTF_Font,所有的文字输出都是围绕这个结构展开的。
- 初始TTF库
- 创建一个对应某个字体文件的TTF_Font.
- 用TTF输出函数把一段文字输出成SDL_Surface.其中TTF_font是其中必须参数
- 把这个SDL_Surface 输出到屏幕显示,如果不需它,必须释放它
- 释放TTF_Font
- 关闭TTF库
4.接口说明
要想显示文字,首先要将文字渲染成一副图像,将文字渲染成一个图像表面,有三种渲染方式:
- TTF_RenderText_Solid渲染的最快,但效果最差,文字不平滑,是单色文字,不带边框。
- TTF_RenderText_Shaded比TTF_RenderText_Solid渲染的慢,但显示效果好于Solid,带阴影。
- TTF_RenderUTF8_Blended渲染最慢,但显示效果最好。
SDL_ttf有好几个关于文字高度和宽度的方法:
- int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h) ;求英文/数字文本高度和宽度,返回值为0表示测试成功
- int TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h) ;求UTF-8文本高宽
- int TTF_SizeUNICODE(TTF_Font *font, const Unit16 *text, int *w, int *h) ;求Unicode文本高宽
TTF使用TF_SetFontStyle(TTF_Font *font, int style)显示特殊效果,style 参数可以设为如下几种效果:
- TTF_STYLE_BOLD #粗体
- TTF_STYLE_ITALIC #斜体
- TTF_STYLE_UNDERLINE #下划线
- TTF_STYLE_STRIKETHROUGH #删除线(即中划线)
如果Style设为 TTF_STYLE_NORMAL, 效果将变成缺省效果。
显示中文代码:直接采用数字编码。
Uint16 msg[1024] = {0x4F60,0x597D,0}; //=Unicode 编码:你好
message = TTF_RenderUNICODE_Solid( font, msg, textColor );
5.示例
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#define WINDOW_W 800
#define WINDOW_H 640
#undef main
int main(int argc,char* argv[])
{
/*SDL初始化*/
SDL_Init(SDL_INIT_VIDEO);
/*TTF初始化*/
TTF_Init();
/*创建窗口*/
SDL_Window *window = SDL_CreateWindow("SDL SHOW TEXT", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_W, WINDOW_H, SDL_WINDOW_SHOWN);
/*创建渲染器*/
SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
/*设置渲染器颜色*/
SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
/*清空渲染器*/
SDL_RenderClear(render);
/*打开字库*/
TTF_Font *ttffont = TTF_OpenFont("GBK.ttf", 50);
if (ttffont == NULL)
{
printf("simkai.ttf open failed\n");
return 0;
}
/*字体颜色RGBA*/
SDL_Color color = { 52,203,120,255 };
SDL_Color bgColor = { 33,33,33,255 };
/*设置字体大小*/
TTF_SetFontSize(ttffont, 60);
/*字体加粗*/
TTF_SetFontStyle(ttffont, TTF_STYLE_NORMAL);
/*创建字体显示表面*/
SDL_Surface *text1_surface = TTF_RenderUTF8_Blended(ttffont, "Hello,SDL!", color);
/*创建纹理*/
SDL_Texture * texture = SDL_CreateTextureFromSurface(render, text1_surface);
/*将surface拷贝到渲染器*/
SDL_Rect dstrect;
dstrect.x = WINDOW_W / 2 - text1_surface->w / 2;/*显示的起始位置*/
dstrect.y = 100;/*显示的起始位置*/
dstrect.w = text1_surface->w;/*显示的宽度*/
dstrect.h = text1_surface->h;/*显示的高度*/
/*创建字体显示表面*/
//SDL_Surface *text1_surface = TTF_RenderUTF8_Blended(ttffont, "Hello,SDL!", color);
Uint16 msg[10] = { 0x4F60,0x597D,',','T','T','F',0 }; //=Unicode 编码:你好
SDL_Surface *text2_surface = TTF_RenderUNICODE_Solid(ttffont, msg, color);
/*创建纹理*/
SDL_Texture * texture2 = SDL_CreateTextureFromSurface(render, text2_surface);
/*将surface拷贝到渲染器*/
SDL_Rect dstrect2;
dstrect2.x = WINDOW_W / 2 - text2_surface->w / 2;/*显示的起始位置*/
dstrect2.y = 180;/*显示的起始位置*/
dstrect2.w = text2_surface->w;/*显示的宽度*/
dstrect2.h = text2_surface->h;/*显示的高度*/
bool bQuit = false;
SDL_Event windowEvent;
while (!bQuit) {
while (SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT:
bQuit = true;
break;
default:
break;
}
}
SDL_RenderClear(render);
SDL_RenderCopy(render, texture, NULL, &dstrect);
SDL_RenderCopy(render, texture2, NULL, &dstrect2);
SDL_RenderPresent(render);
}
SDL_FreeSurface(text1_surface);/*释放surface*/
SDL_DestroyTexture(texture);/*释放纹理*/
TTF_CloseFont(ttffont);
TTF_Quit();
return 0;
}