본문 바로가기

Study/Engine

[Cocos2d-x] 지금까지 느낀 2.x 와 3.x 의 차이점




안녕하세요. 온새미입니다. 오랜만에 코코스에 대한 주제로 포스팅해보는데요, 제목에 써있는 것처럼 Cocos2d-x 의 2.x 와 3.x 의 차이점을 지금까지 써보면서 느낀 것을 나열해보는 시간을 가져볼까 합니다. 절대로 제가 지금 Microsoft Visual Studio 2013 Update 1 의 진행이 더뎌서 시간이 남아서 하는 것이 아닙니다 (...)



1. C++ 11 적용


C++ 의 최신 버전인 11 을 Cocos2d-x 에 적용했습니다. 그래서 C++ 11 에 추가된 기능인 lambda 를 쓸 수 있게 되었네요. 이것이 무엇을 의미하느냐,


// header
...
void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
...
// source
..
void HellWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
...
}
...


기존의 위의 코드처럼 쓰던 것을 아래처럼 쓸 수 있다는 것이죠. 이것이야말로 혁ㅋ명ㅋ


// source
...
void HellWorld::init()
{
...
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [](Touch *touch, Event *event){
...
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
...


저렇게 쓸 수 있게 됨과 동시에 기존에 ccTouches... 로 시작하던 터치 이벤트들이 좀 더 명확하게 정리가 된 것 같습니다. 저번에 참석했던 Cocos2d-x 포럼에서 Zhe Wang Cocos2d-x Founder 가 말하길, "이 터치 시스템을 뜯어고치려고 매우 예전부터 생각해왔는데 이제라도 바꿔서 정말 좋다" 고 말한게 기억나네요.



2. CCxxx -> xxx


CC로 시작하던 모든 Cocos2d-x 관련 클래스나 함수들이 CC를 지우고 새롭게(?) 태어났습니다.


CCSprite *sprite1 = CCSprite::create(); // deprecated
Sprite *sprite2 = Sprite::create();
auto sprite3 = Sprite::create();


auto 는 11 버전부터 추가된 것인지는 잘 모르겠습니다만 유용하네요 ㅋ 컴파일러가 고생할 뿐 프로그래머는 걍 후리면 그만이군요.



3. sharexxx() -> getInstance()


Cocos2d-x 에서 싱글턴 클래스에 접근하려면 썼던 키워드가


CCDirector::shareDirector();


와 같은 형식이었는데, 이제 아래처럼 통일되었습니다.


Director::getInstance()
TextureCache::getInstance();
FileUtils::getInstance();
SpriteFrameCache::getInstance();
...



4. CCTextureCache -> TextureCache -> ?


2.x 에서는 CCTextureCache::shareTextureCache() 로 싱글턴의 TextureCache 를 가져왔는데, 3.0alpha 까진 TextureCache::getInstance() 라고 썼는데, 이번에 Director 에 통합되었습니다.


CCTextureCache::shareTextureCache(); // deprecated
TextureCache::getInstance(); // deprecated
Director::getInstance()->getTextureCache();



5. Hardware Keyboard Support


2.x 까지는 생각도 못했던 PC 에서의 키보드 입력을 3.x 에서 할 수 있게 되었습니다! 유레카!

그래서 이전과 다르게 약간의 코드만 추가한다면 PC 에서도 편하게 게임 테스트가 가능하게 되었습니다. 제가 이 테스트가 불편해서 ThinkPad Twist 를 산 것도 없진 않은데, 이렇게 화끈하게 지원해주니 이거 왜샀나 싶네요 (...) 사용법은 위에 서술한 람다부분에서 약간만 고치면 됩니다.


auto listener = EventListenerKeyboard::create();
listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event *event){
log("%d press", keyCode);
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);


위에 _eventDispatcher 에 있는 SceneGraphPriority 부분은 두가지가 있는데, 자세한건 홈페이지에서.



쓰고나서도 프로그래스바가 진행이 안되서 걍 껐다고 합니다 (...) 업데이트는 자고나서 하는 걸로.