cocos2d-x 에서 레이어를 통해 게임 화면을 구성합니다.
이미지 출처 : http://www.learn-cocos2d.com
이런식으로 말이죠. 레이어를 풀스크린으로 쓰면 상관이 없지만 간혹 특정 크기에 맞춰야 할때가 있습니다. 화면을 분할하여 좌측, 우측 레이어를 구분해서 사용한다던가 할때 말이죠. cocos2d-x의 Layer 클래스는 상위 Node 클래스를 상속 받기 때문에 setContentSize 인터페이스를 사용할 수 있습니다.
하지만 이 인터페이스를 통해 크기를 조절한다 해도 실제 화면에서 보면 아무런 변화가 없습니다.
아래의 그림은 960 x 640 해상도에서 집과 캐릭터를 메인 레이어에 출력한 화면입니다. 이 메인 레이어 사이즈는 가로 해상도의 반인 480 x 640으로 설정해준 상태입니다(하늘 배경은 백그라운드 레이어 ).
bool CGameScene::InitLayer( void ) { bool bRet = false; do { // super init first CC_BREAK_IF( !CCScene::init() ); // 배경 레이어 CGameSceneBGLayer* pBGLayer = CGameSceneBGLayer::create(); CC_BREAK_IF( !pBGLayer ); this->addChild( pBGLayer, 0, CHILD_LAYER_BACKGROUND ); // 메인 레이어 CGameSceneMainayer* pMainLayer = CGameSceneMainLayer::create(); CC_BREAK_IF( !pMainLayer ); pMainLayer->setContentSize( CCSizeMake( 480, 640 ) ); this->addChild( pMainLayer, 0.5, CHILD_LAYER_MAIN ); bRet = true; } while (0); return bRet; }
하지만 실제 화면은 960 x 640 풀 사이즈로 나오고 있습니다. 가로 사이즈 480으로 설정한대로라면 오른쪽에 있는 집, 대머리 캐릭터는 짤려야 정상인데 말이죠. 레이어가 설정해준 480 x 640의 크기로 출력되게 하려면 Layer 클래스를 상속 받아 visit 함수를 아래와 같이 재정의 해주어야합니다.
void CClippingLayer::visit() { glPushMatrix(); glEnable( GL_SCISSOR_TEST ); CCSize contentSize = getContentSize(); CCEGLView::sharedOpenGLView()->setScissorInPoints( getPosition().x, getPosition().y, contentSize.width, contentSize.height ); CCNode::visit(); glDisable( GL_SCISSOR_TEST ); glPopMatrix(); }
이 후 메인레이어를 새로 정의한 CClippingLayer를 상속 받아 사용하면...
이제 원했던대로 메인 레이어가 반만 출력됩니다.