SDL2系列教程8-文本渲染和输入

SDL_ttf

SDL_ttf为True Type Font(TTF)加载和呈现提供API。它与我们使用的其他扩展程序非常相似。与SDL_mixer一样,SDL_ttf引入了另一种资产结构; TTF_Font

安装过程是一样的,我们已经使用了其他扩展。文档可以在这里找到。

初始化

与其他扩展一样,SDL_ttf包括初始化函数TTF_Init()。此功能不带任何参数; 只需在程序启动时调用它即可。

if ( TTF_Init() < 0 ) {
	cout << "Error initializing SDL_ttf: " << TTF_GetError() << endl;
}

要加载字体,SDL_ttf 为单个字体文件提供函数TTF_OpenFont(),使用函数TTF_OpenFontIndex()从包含多个文件的文件加载字体。与其他资源加载函数一样,TTF_OpenFont()采用文件名,但现在也是字体大小(以像素为单位)。该函数返回指向新TTF_Font的指针或失败时为NULL。

TTF_Font* font;

font = TTF_OpenFont("font.ttf", 24);
if ( !font ) {
	cout << "Failed to load font: " << TTF_GetError() << endl;
}

渲染文字

实际上有很多方法可以使用SDL_ttf渲染文本。您可以渲染和存储单个字形(字符),可以渲染UNICODE字符串,可以用几种不同的方式渲染文本(实体,混合,着色)等等。现在,我们将通过一种简单的方式将文本添加到屏幕上。

所有文本呈现方法的基础是创建包含呈现文本的SDL_Surface。TTF_RenderText_Solid()是最直接的方法。这个函数只需要一个TTF_Font指针,一个要呈现的c字符串,以及一个SDL_Color来呈现文本。它返回一个新的SDL_Surface,或失败时为NULL。

SDL_Surface* text;
// Set color to black
SDL_Color color = { 0, 0, 0 };

text = TTF_RenderText_Solid( font, "Hello World!", color );
if ( !text ) {
	cout << "Failed to render text: " << TTF_GetError() << endl;
}

获得包含渲染文本的曲面后,可以使用第0204课中讨论的方法渲染它。例如,您可以从此曲面创建纹理并使用SDL_RenderCopy()进行渲染。

SDL_Texture* text_texture;

text_texture = SDL_CreateTextureFromSurface( renderer, text );

SDL_Rect dest = { 0, 0, text->w, text->h };

SDL_RenderCopy( renderer, text_texture, &dest );

您可能会注意到,使用此方法时,每当我们想要更改输出时,我们必须完全重新渲染字形(代价高昂的操作)。如果您需要渲染更改文本,这效率非常低。为了解决这个问题,您可以将单个字形渲染为纹理,然后根据要显示的文本输出正确的位置。但是,这非常复杂,所以我们不会在这里介绍它。(但是,另一个扩展,SDL_FontCache可以为您执行此操作。)

使用此方法时,每次更改时都必须重新创建文本(调用TTF_RenderText_Solid())。记得释放/破坏我们需要重新创建的纹理的任何表面。

SDL_DestroyTexture( text_texture );
SDL_FreeSurface( text );

文字输入

虽然您可以通过轮询键盘事件在技术上输入文本,但SDL通过SDL_TextInputEvent提供了更方便的方法。此事件类型以更方便的方式输入键盘输入以进行文本输入; 按下的键作为c-string发送。

默认情况下,SDL不会注册这些事件; 您必须调用SDL_StartTextInput()来启用它们。SDL也将开始发送SDL_TextEditingEvents,但您不需要处理这些来执行基本文本输入。完成文本输入后,调用SDL_StopTextInput()以禁用这些事件。

输入字符存储在SDL_TextInputEvent的“text”成员中。您可以通过将这些字符附加到输入缓冲区字符串来捕获此输入,并通过显示缓冲区字符串向用户显示他们正在键入的内容。

最后,您仍然可以监听键盘事件 - 例如,您可以使用退格键从缓冲区字符串中删除最后一个字符。这是在示例程序中完成的。

SDL_StartTextInput();
string in;
bool running = true;

while ( running ) {
	SDL_Event ev;
	while ( SDL_PollEvent( &ev ) ) {
		if ( ev.type == SDL_TEXTINPUTEVENT ) {
			in += ev.text.text;
			cout << " > " << in << endl;
		} else if ( ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_BACKSPACE && in.size()) {
			in.pop_back();
			cout << " > " << in << endl;
		} eles if ( ev.type == SDL_QUIT ) {
			running = false;
		}
	}
}

SDL_StopTextInput();

关掉

关闭SDL_ttf就像其他扩展一样; 使用TTF_CloseFont()释放任何加载的字体并调用TTF_Quit()

TTF_CloseFont( font );
TTF_Quit();

安装ttf库

sudo apt-get install libsdl2-ttf-dev

实例代码下载地址:

https://download.csdn.net/download/cyf15238622067/10697714

Makefile增加C++11选项

测试结果:

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/82908683