라이브러리가 또한 필요하다고 한다. 이것 만드는 사람 대단하다. 나도 그 중 한 명이 되고 싶은데 멀었다.
http://www.libsdl.org/projects/SDL_ttf/
여기서 다운 받는다.
전에서와 마찬가지로 설정을 마치고......(dll 이동 및 lib 추가; 본인은 VS2012 사용...)
SDL_ttf 는 속도와 질의 Trade-off를 가지고 다양하게 텍스트를 렌더링할수 있는 방법을 몇 가지 제공한다고 한다. 가령, 유니코드, UTF-8, 글리프와 같은....
TTF_RenderText_Blended를 사용할 것이다.
SDL_Color로 텍스트의 색상도 지정할 수 있다.
불행하게도(?), SDL_ttf는 표면 즉, Surface에만 렌더링을 수행할 수 있다. 이에 문자를 출력하는 단계는 대략 다음과 같다.
1. 렌더러 생성.
2. 텍스트 생성.
3. 텍스트로 표면 생성.
4. 표면으로 텍스처 생성.
5. 화면에 출력.
TTF_OpenFont로 사용할 폰트를 불러온다.
초기화는 TTF_Init()으로 하되 성공시 0을 리턴한다.
------------------------------------------------------------------------
위 단계를 하나로 밀집한 함수를 만든다.
DL_Texture* MY_RenderText(const std::string &msg, const std::string &fontFile,
SDL_Color color, int fontSize, SDL_Renderer *ren){
TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize);
if(font == nullptr){
MY_LogSDLError(std::cout, "TTF_OpenFont");
return nullptr;
}
SDL_Surface* surf = TTF_RenderText_Blended(font, msg.c_str(), color);
if(surf == nullptr){
TTF_CloseFont(font);
MY_LogSDLError(std::cout, "TTF_RenderText");
return nullptr;
}
SDL_Texture* tex = SDL_CreateTextureFromSurface(ren, surf);
if(tex == nullptr) {
MY_LogSDLError(std::cout, "CreateTexture");
}
SDL_FreeSurface(surf);
TTF_CloseFont(font);
return tex;
}
이를 이용해서 출력을 시도해 본다.
int recordTutorialFour(int argc, char* argv[]){
if( TTF_Init() != 0 ){
MY_LogSDLError(std::cout, "TTF_Init");
return 1;
}
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* win = SDL_CreateWindow("Font", 0, 0, WIDTH_OF_SCREEN, HEIGHT_OF_SCREEN, SDL_WINDOW_SHOWN);
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
const std::string resPath = getResourcePath();
SDL_Color color = { 255, 255, 255, 255 };
SDL_Texture *image = MY_RenderText("TTF fonts are cool!", resPath + "sample.ttf",
color, 64, ren);
if (image == nullptr){
return 1;
}
int iW, iH;
SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
int x = WIDTH_OF_SCREEN / 2 - iW / 2;
int y = HEIGHT_OF_SCREEN / 2 - iH / 2;
//Note: This is within the program's main loop
SDL_RenderClear(ren);
//We can draw our message as we do any other texture, since it's been
//rendered to a texture
MY_RenderTexture(image, ren, x, y);
SDL_RenderPresent(ren);
SDL_Delay(4000);
SDL_DestroyTexture(image);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
TTF_Quit();
return 0;
}
int main(int argc, char* argv[]){
return recordTutorialFour(argc, argv);
}
sample.ttf는 훈하얀고양이R 폰트.
댓글 없음:
댓글 쓰기