1. 程式人生 > >SDL2系列教程8-文字渲染和輸入

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_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();

關掉

TTF_CloseFont( font );
TTF_Quit();

安裝ttf庫

sudo apt-get install libsdl2-ttf-dev

例項程式碼下載地址:

Makefile增加C++11選項

測試結果: