新疆建設(shè)兵團(tuán)125團(tuán)網(wǎng)站什么是網(wǎng)站
1.簡(jiǎn)介
SDL本身沒有顯示文字功能,它需要用擴(kuò)展庫(kù)SDL_ttf來顯示文字。ttf是True Type Font的縮寫,ttf是Windows下的缺省字體,它有美觀,放大縮小不變形的優(yōu)點(diǎn),因此廣泛應(yīng)用很多場(chǎng)合。
使用ttf庫(kù)的第一件事要從Windows的字庫(kù)下拷貝出一個(gè)字庫(kù)出來,最好是中文字體,這樣可以同時(shí)支持英文和中文顯示。它一般在c:windowsfonts 目錄下面。比如simhei.ttf 就是仿黑體的字庫(kù),將這個(gè)文件拷貝到你的源文件目錄下。
要使用SDL_ttf庫(kù)首先要下載該擴(kuò)展庫(kù):為了方便,我使用的開發(fā)環(huán)境是Windows。?
下載地址:Releases · libsdl-org/SDL_ttf · GitHub
我使用的是2.20.0的版本,下載我框出來的那個(gè)zip包。
2.配置環(huán)境
先拷貝SDL_ttf的頭文件和庫(kù)文件到目的目錄下,如下圖所示:
?
VS的配置請(qǐng)看SDL2 簡(jiǎn)單介紹以及Windows開發(fā)環(huán)境搭建-CSDN博客
目錄4.配置,跟配置SDL庫(kù)一樣的配置。
3.使用步驟
SDL_ttf的編程的核心數(shù)據(jù)結(jié)構(gòu)是 TTF_Font,所有的文字輸出都是圍繞這個(gè)結(jié)構(gòu)展開的。
- 初始TTF庫(kù)
- 創(chuàng)建一個(gè)對(duì)應(yīng)某個(gè)字體文件的TTF_Font.
- 用TTF輸出函數(shù)把一段文字輸出成SDL_Surface.其中TTF_font是其中必須參數(shù)
- 把這個(gè)SDL_Surface 輸出到屏幕顯示,如果不需它,必須釋放它
- 釋放TTF_Font
- 關(guān)閉TTF庫(kù)
4.接口說明
要想顯示文字,首先要將文字渲染成一副圖像,將文字渲染成一個(gè)圖像表面,有三種渲染方式:
- TTF_RenderText_Solid渲染的最快,但效果最差,文字不平滑,是單色文字,不帶邊框。
- TTF_RenderText_Shaded比TTF_RenderText_Solid渲染的慢,但顯示效果好于Solid,帶陰影。
- TTF_RenderUTF8_Blended渲染最慢,但顯示效果最好。
SDL_ttf有好幾個(gè)關(guān)于文字高度和寬度的方法:
- int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h) ;求英文/數(shù)字文本高度和寬度,返回值為0表示測(cè)試成功
- 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 參數(shù)可以設(shè)為如下幾種效果:
- TTF_STYLE_BOLD #粗體
- TTF_STYLE_ITALIC #斜體
- TTF_STYLE_UNDERLINE #下劃線
- TTF_STYLE_STRIKETHROUGH #刪除線(即中劃線)
如果Style設(shè)為 TTF_STYLE_NORMAL, 效果將變成缺省效果。
顯示中文代碼:直接采用數(shù)字編碼。
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();/*創(chuàng)建窗口*/SDL_Window *window = SDL_CreateWindow("SDL SHOW TEXT", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_W, WINDOW_H, SDL_WINDOW_SHOWN);/*創(chuàng)建渲染器*/SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);/*設(shè)置渲染器顏色*/SDL_SetRenderDrawColor(render, 255, 255, 255, 255);/*清空渲染器*/SDL_RenderClear(render);/*打開字庫(kù)*/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 };/*設(shè)置字體大小*/TTF_SetFontSize(ttffont, 60);/*字體加粗*/TTF_SetFontStyle(ttffont, TTF_STYLE_NORMAL);/*創(chuàng)建字體顯示表面*/SDL_Surface *text1_surface = TTF_RenderUTF8_Blended(ttffont, "Hello,SDL!", color);/*創(chuàng)建紋理*/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;/*顯示的高度*//*創(chuàng)建字體顯示表面*///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);/*創(chuàng)建紋理*/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;
}