라벨이란?
텍스트와 더불어 위치 값, 앵커 포인트 등 정보 값을 함께 가지고 있는 객체(스프라이트와 비슷)
종류 : SystemFont, TrueTypeFont, BMFont, CharMap
폰트 타입들은
cocos메인 폴더\tests\cpp-tests\Resources\fonts
에 많이 있다. 원하는 폰트를 해당 프로젝트의 resources 폴더에 복사하여 쓰면된다.
1) SystemFont 출력
auto label = Label::createWithSystemFont("Hello world!", "Thonburi", 34, Size(150, 150), TextHAlignment::LEFT, TextVAlignment::CENTER);
label->setPosition(Point(240, 160));
label->setColor( Color3B::RED );
this->addChild(label);
//auto label = Label::createWithSystemFont( 텍스트 내용, 폰트 이름, 글씨 크기, 텍스트박스 크기, 가로정렬, 세로정렬 )
//텍스트 내용, 글꼴, 글씨 크기는 필수
//setPosition은 라벨(텍스트박스)의 위치를 의미
//정렬은 텍스트 박스 내에서 글자들의 정렬 기준을 나타냄
//시스템 폰트를 사용할 때에는 폰트를 ""로 비워두어도 무방함(대부분 pc에 없기 때문)
//#pragma execution_character_set("utf-8"); 를 추가하면 한글 폰트가 제대로 출력됨
//윈도우에서는 깨져나오지만 안드로이드에서는 제대로 나옴
2) TTF 출력
여러가지 효과를 줄 수 있는 폰트. 효과에 따라 색깔 등을 따로 줄 수 있기 때문에, 글자색을 바꿀 때 setColor를 쓰는 다른 폰트들과는 달리 setTextColor 메소드를 사용한다.
auto label = Label::createWithTTF("Hello world!", "A Damn Mess.ttf", 34);
label->setPosition(Point(240, 160));
//label->enableOutline(Color4B(0, 0, 255, 128), 3); //외곽선 효과를 주는 함수. 색깔과 두께.
//label->enableShadow( Color4B , Size(x, y) , blur); //색깔, 그림자의 위치(라벨 (0,0)기준),블러
//label->enableGlow( Color4B ) //형광색 그림자같은 느낌. shadow와 비슷한 기능
this->addChild(label);
//TTF는 폰트 이름에 확장자까지 같이 적어줘야 한다.
//해당 글꼴이 프로젝트의 resources / fonts 폴더에 있어야한다.
//TTF에서 사용가능한 글자 효과 - Outline, Shadow, Glow
3) BMFont
.png파일로 만들어진 비트맵 파일을 기반으로 하여 쓰는 폰트. 한 쌍의 png/fnt파일이 둘다 필요. 다른 폰트들과 달리 글자 사이즈를 입력하지 않는다. 사실상 폰트라기보단 이미지에 가까움.
auto label = Label::createWithBMFont("bitmapFontTest.fnt", "THIS IS IT");
label->setPosition(240, 160);
label->setScale(2);
this->addChild(label);
//폰트파일 명과 입력할 텍스트 내용으로 초기화한다.
//이미지파일 기반이기 때문에 setScale()함수를 통해 크기를 조절할 수 있다.
//http://angelcode.com/products/bmfont/ 여기서 bmfont제작툴을 받을 수 있다.
+TTF와 BMF의 차이
TTF는 벡터 방식으로 처리하기 때문에 BMF에 비해 폰트 처리 속도가 느린 편(폰트 양이 많이 않다면 크게 차이 안나옴)
텍스트 양이 많고 글자 크기의 변화가 없다면 BMF가 성능적 측면에서 훨씬 이득
4) CharMap
BMF와 달리, fnt파일이 따로 없이 사용자가 파일의 정보를 직접 지정할 수 있게 한 폰트.
단, 각 글자의 높이/너비가 동일해야하며, 글자의 순서가 아스키코드의 순서와 동일하게 하여 이미지 파일을 만들어야 한다. 대개 숫자를 라벨로 출력할 때 많이 사용된다.
int score = 331245; //게임에서 사용되는 점수
auto label = Label::createWithCharMap("no_01.png", 33, 45, '0');
label->setString(StringUtils::format("%d", score) ); //점수를 라벨에 출력하기위해 사용
label->setColor(Color3B::WHITE);
label->setPosition(240, 160);
this->addChild(label);
//(이미지 파일 명, 한 글자당 넓이, 한 글자당 높이, 첫 시작 문자의 아스키 코드 값) 순서로 초기화
+ Color3B와 Color4B의 차이점?
3B는 R, G, B의 3개 속성을 가진 기본 컬러고, 4B는 이 RGB에 투명도까지 더한 것.
+ getString / setString 함수를 이용해 라벨의 내용을 가져오거나 설정한다.
+ Label에 %d와 같이 변수를 사용할 경우, StringUtils::format을 사용하여 텍스트를 입력한다.
+ 코드상의 문제가 없는데 폰트 관련하여 문제가 생겼을 경우
1) 다른 폰트를 로드하여 써본다 -> 될 경우 폰트 파일의 문제
2) 다른 내용(영어/한글 등)을 써서 해본다