프로그래밍/Cocos2d-x

Sub-CCB를 포함하고 있는 Main-CCB와 Sub-CCB에 각각 Custom Class 로딩하는 방법

standwally 2013. 12. 6. 10:13

MainMenuScene.ccb라는 파일이 Custom class 'HelloWorldScene'와 연결되어 있다.



그리고, MainMenuScene.ccb 파일안에서 CCScrollView Container의 Sub-ccb파일로서,

SubMenus.ccb파일이 연결되어 있다.


MainMenuScene.ccb 의 UI에 이벤트 콜백 또는 멤버 변수가 있고,

SubMenus.ccb UI에도 별도의 이벤트 콜백 또는 멤버 변수가 있다고치자,

 

MainMenuScene.ccb 는 HelloWorldScene 클래스와 연결되어 있어서 해당 이벤트나 멤버 변수를 받아서 처리할 수 있다.

하지만, SubMenus.ccb 파일도 Custom class로서 HelloWorldScene을 지정해 놓으면,

Appdelegate.cpp
1
CCNode *node = reader->readNodeGraphFromFile("MainMenuScene.ccbi");

위와 같이 ccbi파일을 읽어들이는 순간,

MainMenuScene.ccbi과 SubMenus.ccbi 파일에서 HelloWorldScene을 바라보고 있기 때문에,

HelloWorldScene 객체가 각각 할당이 되는 이상한 구조가 되어 버린다.

 

이러한 문제를 해결하기 위해서는, 각각의 ccb파일에서 로드할 별도의 Custom class를 만들어준다.

SubMenus 클래스를 새로 추가해서, 아래와 같이 SubMenus.ccb의 Custom class에 지정해준다.


그리고 나서, ccbi 파일을 읽는 단계에서는 아래와 같이 처리해주면 된다.

 

AppDelegate.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CCFileUtils::sharedFileUtils()->addSearchPath("Main");
CCFileUtils::sharedFileUtils()->addSearchPath("Main/SubMenu");
 
CCNodeLoaderLibrary *nodeLoader = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
nodeLoader->registerCCNodeLoader("SubMenus", SubMenusLoader::loader());                            // 각각의 클래스 로더를 등록해주면,
nodeLoader->registerCCNodeLoader("HelloWorldScene", HelloWorldSceneLoader::loader());
CCBReader *reader = new CCBReader(nodeLoader);
CCNode *node = reader->readNodeGraphFromFile("MainMenuScene.ccbi");                                // Sub-ccbi를 갖고 있는 Main-ccbi를 읽어들일때, 동적으로 알아서 해당 Custom class를 연결해줌.
reader->release();
 
CCScene *pScene = CCScene::create();
if (node != NULL) {
    pScene->addChild(node);
}

 

HelloWorldScene 클래스와 SubMenus 클래스 로더를 CCNodeLoaderLibrary 객체에 등록시켜주면,

SubMenus.ccbi을 포함하고 있는 MainMenuScene.ccbi 파일을 읽어들일때,

동적으로 알아서 해당 Custom class와 연결해준다.


클래스와 리소스의 폴더 구조는 아래와 같다.