달력

5

« 2025/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

MenuItemFont는 스프라이트처럼 하나하나를 레이어에 추가시키는게 아니라, 만들어둔 아이템들을 'Menu'라는 클래스에 추가하여 생성한 뒤, 해당 메뉴를 레이어에 추가하는 것임.

즉, '스프라이트-레이어' 의 관계가 메뉴에서 '메뉴아이템-메뉴' 의 관계와 유사함.


auto item_01 = MenuItemFont::create("Play");        //play 아이템 생성

auto item_02 = MenuItemFont::create("Quit");        //quit 아이템 생성


auto menu = Menu::create(item_01, item_02, NULL);    //두개의 아이템을 추가한 메뉴 생성

//NULL은 더이상 추가할 아이템이 없다는 것을 알려주는 역할

menu->alignItemsVertically();                                    //아이템들을 수직으로 자동 정렬

//menu->alignItemsVerticallyWithPadding(20);

//이렇게 패딩을 통해 아이템들 사이에 빈 공간을 채워서 여유를 줄 수 있다.

//이렇게 정렬을 안해주면, 두 아이템이 기본값으로 추가됐기때문에 겹치게 나옴

this->addChild(menu);                    //아이템이 아닌 메뉴를 레이어에 추가


+ 메뉴/메뉴 아이템의 기본 위치값(좌표/앵커포인트)



메뉴 아이템 클릭시 동작하게 만드는 함수 추가

void playCallback(Ref* sender);

void quitCallback(Ref* sender);


+ Ref* sender란?



위의 아무 동작 안하는 메뉴들 중, play를 수정해서 클릭시 동작하게끔 함수를 바꾼다.

auto item_01 = MenuItemFont::create("Play", CC_CALLBACK_1(HelloWorld::playCallback, this));

//this는 타겟. 여기서는 playCallback이 있는 HelloWorld가 된다.

//이렇게 바꿔줌을 통해, play를 클릭하면 playCallback함수가 호출된다.

//playCallback함수의 호출과 동시에 item_01자기 자신이 함수의 파라미터로 넘어간다.

//아이템에 해당된 함수는 클릭(터치)을 눌렀다가 뗄 시에 호출된다.


+ CC_CALLBACK_1이란?( CC_CALLBACK_n )



MenuItemFont는 말 그대로 font만 직접 입력하여 사용하는 것이기 때문에 다양한 활용도가 없다.

그래서 대신에 MenuItemLabel을 사용하면, 라벨을 이용하여 메뉴를 구성할 수 있다.


//라벨 아이템 생성

auto label_01 = Label::createWithBMFont("west_england-64.fnt", "PLAY");

auto item_01 = MenuItemLabel::create(label_01, CC_CALLBACK_1(HelloWorld::playCallback, this));

//메뉴에 추가하는 건 동일함



+메뉴별 callback을 menuCallback하나로 묶은 코드


:
Posted by 웽웽

라벨이란?

텍스트와 더불어 위치 값, 앵커 포인트 등 정보 값을 함께 가지고 있는 객체(스프라이트와 비슷)

종류 : 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) 다른 내용(영어/한글 등)을 써서 해본다

:
Posted by 웽웽

화면을 구성하는 여러가지 스프라이트들의 z축 위치를 관리하기 위해서 enum을 사용하면 편하다.


enum Z_ORDER

{

BG,            //0

PLAYER,    //1

ENEMY,    //2

UI_TEXT = 10,        //중간에 임의로 값을 지정해줄 수 있음. 단 이 경우 다음것에도 영향을 줌

GAMEOVER            //10다음이니 11로 지정됨

};


이렇게 Z_ORDER를 설정한 뒤, addchild를 통해 스프라이트를 화면에 추가할 경우

this->addchild( spr , Z_ORDER::PLAYER );

이와 같은 식으로 해당 스프라이트의 z축 크기를 설정해서 추가할 수 있다.

:
Posted by 웽웽