티스토리 뷰

프로그래밍/게임 개발

[Cocos2d-x] Custom number label

터프 프로그래머 2013. 7. 24. 11:25


예전에 DirectX에서 숫자를 화면상에 띄울 때는 숫자마다 그림을 따로 둬서 출력했었는데요.

Cocos2d-x에 Label이 잘 되어 있긴 합니다만 커스텀 텍스쳐를 이용하여 Label을 만드는것은 조금 난해하더군요.

.fnt 파일 만드니, 뭐니 하는건 갠적으로 별로 맘에 안들어서 그냥 이전처럼 직접 만들었습니다.

소스 보시면 딱 감이 오실텐데요.


CCNode* MakeNumberLabel( unsigned int number, const char* texture_file_name, const float width, const float height )

{

CCArray *frames = CCArray::create();

CCSpriteFrame *frame;


int i;

for( i=0; i<10; i++ )

{

frame = CCSpriteFrame::create( "sprite_numBig.png", CCRect::CCRect( width*i, 0, width, height ) );

frames->addObject( frame );

}


CCArray *nums = CCArray::create();

if( number > 0 )

{

while( number != 0 )

{

nums->addObject( CCInteger::create( number%10 ) );

number /= 10;

}

}

else

nums->addObject( CCInteger::create( 0 ) );



CCNode *numberLabel = CCNode::create();

numberLabel->setAnchorPoint( ccp( 0, 0 ) );


int num;

float offset;

CCSprite *spr;

for( i=nums->count()-1; i>=0; i-- )

{

num = ( dynamic_cast<CCInteger*>( nums->objectAtIndex(i) ) )->getValue();

offset = (nums->count() - 1 - i) * width;

frame = dynamic_cast<CCSpriteFrame*>( frames->objectAtIndex(num) );

spr = CCSprite::createWithSpriteFrame( frame );

spr->setAnchorPoint( ccp( 0, 0 ) );

spr->setPositionX( offset );


numberLabel->addChild( spr );

}


return numberLabel;

}


함수 인자를 보시면 아시겠지만 출력할 숫자, 숫자 텍스쳐의 파일경로, 각 숫자 타일 하나하나의 가로, 세로 값을 넣어주면 됩니다.

텍스쳐파일에는 0부터 9까지의 숫자가 순서대로 모두 동일한 크기로 이어붙어져 있어야 하구요. (스프라이트 애니메이션 그림 파일처럼요.)

함수 내부에서 CCNode를 생성하고, 그 자식들로 각 자리의 숫자를 CCSprite로 만들어 child로 만듭니다. 

즉, 숫자의 길이 + 1개만큼 노드가 생성됩니다. 

그리고 만들어진 숫자라벨의 AnchorPoint는 좌측 하단입니다. (Align 기능 등은 구현하지 않았습니다.)



사용법 : 

CCNode *numLabel = MakeNumLabel( 1234, "sprite_numBig.png", 100, 145 );

numLabel->setScale( 0.5 ); // 크기를 반으로 작게 바꿈

numLabel->setPosition( ccp( 100, 100 ) ); //위치를 100,100으로 옮김

Layer->addChild( numLabel ); // 레이어에 등록

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday