cocos2d-x 2.0.1에서 2.1.0으로 Win32만 Migration

 회사에서 개발중인 프레임워크가 1차 버전이 어느정도 일단락 되었습니다. 그래서 cocos2d-x 버전을 2.0.1버전에서 최신인 2.1.0으로 마이그레이션 하면서 나오는 이슈들을 정리해봅니다. 이번 포스팅 이후로는 cocos2d-x 2.1.0 기반 내용들이 되겠네요.

 2.0.1 에서 2.0.2, 2.0.3, 2.0.4, 2.1.0 으로 버전업 하는데 약 6달간 많은 수정 및 추가 사항들이 있었습니다. 개중에 버그 수정등은 제외하고 중요하다고 생각되는 Feature 추가&수정 사항 몇개를 리스트로 정리해보겠습니다.
 좀 더 자세한 사항은 cocos2d-x CHANGELOG를 확인해보시기 바랍니다.

 본격적으로 정리에 앞서, 관심있으신 분들은 계속 읽어나가시면 되고 아니라면 그냥 새로운 프로젝트 진행할 때 cocos2d-x 업그레이드 하시는게 정신 건강에 좋다는 걸 염두해두시기 바랍니다.

win32 Visual Studio Template Install

 언제나 그렇듯? cocos2d-2.1beta3-x-2.1.0에 있는 install-templates-msvc.bat를 실행해줍니다.

 그럼 이제 비쥬얼 스튜디오에서 cocos2d-x 프로젝트 생성이 여전히 잘되겠지? 했는데 위 스샷부분에서 아무리 확인을 눌러도 다음으로 넘어가지 않는 증상이 발생하더군요. 뭐가 문제인지 잘 모르니 일단 템플릿을 클린하게 설치해보고자 기존에 설치 되었던 cocos2d-x win32 Visual Studio Template를 삭제해봤습니다.

 그리고 다시 install-templates-msvc.bat를 실행했으나 설치가 제대로 안되더군요. 해결하려면 cmd나 탐색기등을 관리자 권한으로 실행 후 install-templates-msvc.bat를 실행해야 설치가 되더군요. install-templates-msvc.bat를 관리자 권한으로 실행하는게 아니구요. 분명 집에서는 그냥 실행해도 잘 되었는데 말이죠.


cocos2d-x Lib 추가 및 수정

 몇번 이야기가 나왔던 것 같은데 저는 cocos2d-win32.vc2010.sln 같은 cocos2d-x 솔루션이 아닌 저만의 솔루션을 만들어서 진행중입니다. 그래서 cocos2d-x로 개발하는 일반상황과는 다른 내용이 더 있을 수가 있죠. 링크에도 있는 내용중 하단부의 내용입니다. cocos2d-win32.vc2010.sln 같은 기존 솔루션에서 작업하시는 분은 무시하셔도 됩니다.

  먼저 기존에 추가되어있던 libcocos2d와 libCocosDenshion은 2.0.1의 것이었기 때문에 솔루션에서 삭제하고, 2.1.0용으로 추가를 합니다.

 위치는 위와 같습니다. 또한 두 프로젝트의 속성도 아래와 같이 수정했습니다.
  • 출력 디렉터리 - $(SolutionDir)..\Libs\Dependency\$(Configuration).win32\
  • 중간 디렉터리 - $(SolutionDir)..\Build\$(ProjectName)$(Configuration).win32\

libcocos2d 링크 전 이벤트

if not exist "$(OutDir)" mkdir "$(OutDir)"
xcopy /Y /Q "$(SolutionDir)..\Engine\cocos2d-2.1beta3-x-2.1.0\cocos2dx\platform\third_party\win32\libraries\*.*" "$(OutDir)"

 위와 같이 수정했습니다.

 한가지 더, 제가 만들고 있던 프레임워크 테스트용 게임이 Extensions을 사용중인데 기존에는 cocos2dx의 하위 폴더에 포함되어 있던 것이 따로 프로젝트로 만들어져 있네요. 이것 역시 추가해줍니다. 역시나 출력, 중간 디렉터리도 위와같이 수정해줍니다.

 빼먹지 말고 개발중인 프로젝트의 종속성에 추가한 libExtensions도 추가해줍니다.


개발중인 프로젝트 속성 수정

 추가 포함 디렉토리에 $(SolutionDir)..\Engine\cocos2d-2.0-rc2-x-2.0.1\cocos2dx 이런식으로 2.0.1 부분을 cocos2d-2.1beta3-x-2.1.0 로 모두 변경해줍니다. $(SolutionDir)..\Engine\cocos2d-2.1beta3-x-2.1.0\extensions 도 필요하다면 추가합니다.

 링커 -> 입력 -> 추가 종속성에 libExtensions.lib 를 추가합니다.


컴파일 및 링크 에러들 수정

 이제부터 본격적인 내용인 듯 합니다. 특히나 저는 Extensions에 있는 CocosBuilder 관련 된 것과 CCListView를 사용했는데 이 부분에서 에러가 많네요.
  • error C2664: 'cocos2d::CCNode *cocos2d::extension::CCBReader::readNodeGraphFromFile(const char *,cocos2d::CCObject *,const cocos2d::CCSize &)' : 매개 변수 2을(를) 'const char *'에서 'cocos2d::CCObject *'(으)로 변환할 수 없습니다. 1>          가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
 구버전은 ccb루트 패스와, ccb파일명, owner Node를 받았는데 이제는 루트 패스를 따로 설정하게 변경되었네요. CCBReader::setCCBRootPath() 함수를 통해 루트 패스 설정하는 것으로 변경합니다.

  • error C2440: '초기화 중' : 'cocos2d::CCEGLView *'에서 'cocos2d::CCEGLView &'(으)로 변환할 수 없습니다.
  • classes\appdelegate.cpp(58): error C2102: '&'에 l-value가 있어야 합니다.
 CCEGLView::sharedOpenGLView()가 *를 반환하게 변경되었네요. 위에꺼는 &에서 *로 변경하고 밑에꺼는 &를 빼줍니다.

  • error C2660: 'cocos2d::CCEGLViewProtocol::setDesignResolutionSize' : 함수는 2개의 매개 변수를 사용하지 않습니다.
 처음에 소개했던 크로스 플랫폼 관련 해상도 처리 보완 및 강화 때문에 인자를 하나 더 요구합니다. 일단 kResolutionNoBorder 를 추가합니다.

  • error C2228: '.run' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
 역시나 CCApplication::sharedApplication()이 *를 리턴하네요. . 을 -> 로 변경합니다.

  • error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
  • warning C4183: 'LAYER_CREATE_FUNC': 반환 형식이 없습니다. 'int'를 반환하는 멤버 함수로 간주됩니다.
  LAYER_CREATE_FUNC, SCENE_CREATE_FUNC define이 CREATE_FUNC로 통합되었네요.

  • error C2665: 'cocos2d::CCSprite::create' : 3개의 오버로드 중 모든 인수 형식을 변환할 수 있는 오버로드가 없습니다.
 CCSpriteFrame*를 인자로 받던 CCSprite::create가 createWithSpriteFrame로 변경되었네요.

  • error C2665: 'cocos2d::CCArray::create' : 2개의 오버로드 중 모든 인수 형식을 변환할 수 있는 오버로드가 없습니다.
 CCArray::Create() 에 인자로 배열 갯수를 넘겨줬었는데 createWithCapacity로 변경되었네요.

  • error C2660: 'cocos2d::CCDictionary::create' : 함수는 1개의 매개 변수를 사용하지 않습니다.
 인자로 plist 파일명을 넘겨줬는데 createWithContentsOfFile로 변경되었네요.

  • error C2440: '초기화 중' : 'cocos2d::CCFiniteTimeAction *'에서 'cocos2d::CCSequence *'(으)로 변환할 수 없습니다. 1>          기본 형식에서 파생 형식으로 캐스팅하려면 dynamic_cast 또는 static_cast가 필요합니다.
 CCSequence::create()가 기존에는 CCSequence*를 리턴하더니만 CCFiniteTimeAction*를 리턴하네요. 또는 createWithTwoActions도 관련이 있습니다.

  • error C2259: 'GameLayer' : 추상 클래스를 인스턴스화할 수 없습니다. 다음 멤버가 원인입니다.
  • 'bool cocos2d::extension::CCBMemberVariableAssigner::onAssignCCBMemberVariable(cocos2d::CCObject *,const char *,cocos2d::CCNode *)' : abstract입니다.
  • 'cocos2d::SEL_MenuHandler cocos2d::extension::CCBSelectorResolver::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *,const char *)' : abstract입니다.
  • 'cocos2d::extension::SEL_CCControlHandler cocos2d::extension::CCBSelectorResolver::onResolveCCBCCControlSelector(cocos2d::CCObject *,const char *)' : abstract입니다.
 CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD( GameLayer, create ); 를 통해서 하고 있는데 아무리봐도 제가 선언한 GameLayer는 가상함수가 없는데 에러가 나더군요. 봤더니 다음 멤버가 원인인 놈들이 죄다 인자 형식이 바꼈습니다. 기존에 CCString*를 받던 것들이 const char*로 변경되었더군요.

  • fatal error C1083: 포함 파일을 열 수 없습니다. 'extensions/CCListView/CCListView.h': No such file or directory
 CCListView가 CCTableView로 변경되었네요. 위치는 GUI/CCScrollView/CCTableView.h 입니다. 또한,

 위 스샷을 보시면 아시겠지만 단순 CCTableView로만 변경해서 해결된 내용이 아닌지라 처음에도 언급했지만, 이부분은 샘플등을 보시면서 새로 작업하시는 것이 정신 건강에 좋습니다. 구현해야 할 것들 중 간략하게 매칭되는 함수들을 정리해보면,

  • CCListView_didClickCellAtRow - tableCellTouched
  • CCListView_cellForRow - tableCellAtIndex
  • CCListView_numberOfCells - numberOfCellsInTableView
 왼쪽이 CCListViewDelegate의 함수들이고 오른쪽은 CCTableViewDelegate 또는 CCTableViewDataSource의 함수들입니다. 추가적으로 cellSizeForTable 이란 녀석도 구현해줘야 합니다.

  • error C2039: 'CCRectContainsPoint' : 'cocos2d::CCRect'의 멤버가 아닙니다.
  • error C3861: 'CCRectContainsPoint': 식별자를 찾을 수 없습니다.

 기존에는 CCRect의 전역 멤버 함수로 있던것이 bool containsPoint(const CCPoint& point) const; 이런 일반 멤버함수로 변경되었습니다.

  • LINK : fatal error LNK1104: 'libGLESv2.lib' 파일을 열 수 없습니다.
 기존에는 Win32에서도 OpenGLES lib를 사용했나봅니다. 이제는 libGLESv2.lib 대신 opengl32.lib 를 추가 종속성에 걸어주면 됩니다.


Runtime Error

 저는 여기까지해서 컴파일 오류를 모두 수정했습니다. 이제 실행을 해보면 위와 같이 Assert에 걸리는데요,

 호출스택은 위와 같습니다. 업데이트가 되면서 setDesignResolutionSize를 호출해줘야할 위치가 바겼네요. 지난 9월에 포스팅했던 cocos2d-x 플랫폼별 해상도와 리소스 관련 정리에서 어느분이 뎃글로 관련 내용을 남겨주었던게 생각나네요. 뎃글의 내용처럼 기존 main.cpp에 있던 것을 AppDelegate::applicationDidFinishLaunching()안에서 setOpenGLView 후에 처리해주면 됩니다.

 이제 다시 실행하면 잘 될까요? 처음에도 말했지만 저는 프레임워크 테스트 게임을 CocosBuilder로 개발했었습니다.

WARNING! Incompatible ccbi file version (file: 2 reader: 4)

 위 로그와 함께 ccbi 로딩 실패로 진행이 안되는군요. 그동안에 CocosBuilder도 버전업을 많이 했으니 뭐 당연하겠죠. 처음에는 그냥 코드베이스로 작업 했었는데 이렇게 코코스빌더가 발목을 잡을줄은... 포스팅이 길어지니 코코스빌더 관련 마이그레이션은 다른 포스팅에서 해볼까 합니다.

 일단 마이그레이션 정리를 win32만 진행해봤습니다. 저야 회사 주 업무가 게임에 쓰일 프레임워크 딴 작업인지라 이런것도 해봤는데요, 처음에 언급한데로 굳이 이런 삽질하실 분은 없으리라 생각이 드네요. 새로운 프로젝트를 진행하게 된다면 그때 cocos2d-x 최신 버전으로 갈아타는 걸 추천드립니다.

 이제 안드로이드와 iOS 쪽 마이그레이션이 남았습니다. 많은 컴파일 에러를 수정했기 때문에 안드로이드와 iOS에서는 이슈가 적을 듯 한데요. 양을 봐서 이 포스팅에 추가하거나 따로 정리하겠습니다. 그냥 win32까지만 정리하는 걸로 마무리하고 어짜피 게임도 기획이 많이 바뀔듯 해서 이 프레임워크 테스트 게임은 가져올 소스만 가져오고 버려야겠네요 ㅎㅎ; 새로 프로젝트 만들어서 시작하는게 좋을 듯.

 마지막으로 작업하면서 포스팅한 내용중 cocos2d-x 버그로 cocos2d-x 딴까지 수정을 가했던 내용들이 몇개 있었죠.

 대충 cocos2d-x 2.1.0 소스를 확인해보니 iOS 키보드 관련은 확실히 수정이 된 듯하네요. 기존에는 땜빵씩 코드였다면 이번에는 뭔가 제대로 처리를 해놨더군요. CCScrollView관련 버그도 수정 된 듯보이구요. 안드로이드 레티나 이미지는 아직 모르겠네요. 3가지다 아직 테스트 전이라...

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.