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; }
獲得包含渲染文字的曲面後,可以使用第02或04課中討論的方法渲染它。例如,您可以從此曲面建立紋理並使用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選項
測試結果: