cocos2d-x 에서 레이어를 통해 게임 화면을 구성합니다.


이미지 출처 : http://www.learn-cocos2d.com


이런식으로 말이죠. 레이어를 풀스크린으로 쓰면 상관이 없지만 간혹 특정 크기에 맞춰야 할때가 있습니다. 화면을 분할하여 좌측, 우측 레이어를 구분해서 사용한다던가 할때 말이죠. cocos2d-x의 Layer 클래스는 상위 Node 클래스를 상속 받기 때문에 setContentSize 인터페이스를 사용할 수 있습니다.


하지만 이 인터페이스를 통해 크기를 조절한다 해도 실제 화면에서 보면 아무런 변화가 없습니다.


아래의 그림은 960 x 640 해상도에서 집과 캐릭터를 메인 레이어에 출력한 화면입니다. 이 메인 레이어 사이즈는 가로 해상도의 반인 480 x 640으로 설정해준 상태입니다(하늘 배경은 백그라운드 레이어 ).



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 함수를 아래와 같이 재정의 해주어야합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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를 상속 받아 사용하면...



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



출처 : http://kindtis.tistory.com/489

+ Recent posts