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를 상속 받아 사용하면...



이제 원했던대로 메인 레이어가 반만 출력됩니다.


+ Recent posts