열혈강의 Cocos2d-x 게임 프로그래밍열혈강의 Cocos2d-x 게임 프로그래밍 - 10점
함동기 지음/이한디지털리(프리렉)

Cocos2d-x 게임 프로그래밍이라는 주제로 책을 썼습니다. 그동안 블로그와 마이크로소프트웨어에 연재했던 내용을 기본으로 했지만 새로 쓴 부분이 훨씬 많습니다. 대상 독자는 학생 및 초중급 개발자입니다. Cocos2d-x의 기본 개념부터 시작해서 퍼즐 게임과 횡스크롤 액션 게임을 만드는 것까지 다뤘습니다. 중간중간 깨알같은 팁도 많이 있습니다. 많은 사랑 부탁드려요^^

http://bongman.tistory.com2014-01-25T22:43:530.31010


신고
Creative Commons License
Posted by 가리봉맨

앱이 실행 중 크래쉬됐을 때는 크래쉬 덤프(crash dump)를 확인하면 대강의 원인을 파악할 수 있다. 이를 위해 ‘Addr2line’ 라는 툴을 사용한다. Addr2line 툴은 명령어 주소와 실행 이미지를 파일 이름, 함수 이름, 소스 라인 번호로 변환하는 유틸리티이다. NDK는 ‘arm-linux-androideabi-addr2line’ 라는 이름으로 해당 툴을 제공한다.


먼저 아래 그림과 같이 사용자 계정의 루트 디렉토리로 이동한 뒤 편집기로 .bash_profile 파일을 연다. 



그리고 PATH 에 ‘arm-linux-androideabi-addr2line’ 툴이 있는 디렉토리를 다음과 같이 추가한다.


 export PATH=${PATH}:$NDK_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin


여기서 ‘$NDK_ROOT’ 는 NDK가 설치된 디렉토리를 의미한다. 각자 환경에 맞게 절대 경로를 넣는다. 설정을 마쳤으면 현재 프로젝트의 /proj.android 디렉토리로 이동한 뒤 아래와 같이 Addr2line를 실행한다.


 arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>


libXXX.so 는 게임 소스 라이브러리를 의미하며 기본으로 설정된 이름을 수정하지 않았다면 libgame.so 다. <address>는 앱이 크래쉬됐을 때 이클립스 LogCat에 출력되는 주소 값이다.


아래 그림은 앱이 크래쉬됐을 때 LogCat에 출력되는 로그다. 하이라이트된 라인의 000e6c54가 크래쉬된 코드의 주소 값이다. 



이 주소 값을 Addr2line 툴에 넘겨주고 실행해 보면 아래 그림과 같이 문제가 된 파일명인 ‘HelloWorldScene.cpp’과 ‘76’ 이라는 라인 정보, 그리고 멤버 함수명인 ‘HelloWorld::init()’ 까지 출력된다.



이것으로 세 번에 걸친 Cocos2d-x 안드로이드 디버깅 연재를 마치겠다.


저작자 표시
신고
Creative Commons License
Posted by 가리봉맨

PC 프로그램 개발은 개발 환경과 실행 환경이 같다. 하지만 모바일 앱은 개발을 PC(맥 포함)에서 하지만 실행 환경은 모바일 기기다. 즉, 프로그램이 PC 에뮬레이터 상에서 정상적으로 작동한다고 해도 모바일 기기에서는 그렇지 않을 수 있다. 기기 디버깅이 반드시 필요한 이유다.


타겟 디바이스가 iOS 기기라면 디버깅에 Xcode를 그대로 사용하면 된다. 하지만 안드로이드 기기에서는 상대적으로 디버깅이 어려운 이클립스(eclipse) 또는 커맨드라인 도구(Command Line Tool)를 이용할 수 밖에 없다. 이에 안드로이드 기기 디버깅 방법을 총 세 편의 포스트를 통해 알아보겠다.


이에 앞서 Cocos2d-x 설치 시 함께 제공되는 스크립트(create-android-project.sh)를 이용해서 기본 프로젝트를 만든다. 프로젝트 이름은 “Cocos2dxTest”로 한다. 참고로 현재 Cocos2d-x 최신 버젼은 2013년 1월 28일에 릴리즈된 버젼 2.1.1이다.


<그림1> Cocos2d-x 안드로이드 프로젝트 생성


이 포스트는 연재의 첫번째 편으로 이클립스 LogCat 창에 로그를 찍는 방법을 알아보겠다. Xcode에서는 C++ 소스 코드에서 CCLog 메서드를 호출해서 콘솔 창에 로그를 출력한다. 이클립스에서도 같은 방법으로 콘솔 창에 로그를 출력할 수 있다.

/cocos2dxTest/Classes/HelloWorldScene.cpp 파일의 HelloWorld:scene() 메서드에 다음 코드를 입력한다.


CCLog(“start HelloWorld scene!”); 


만약 CDT 플러그인을 설치했다면 <그림2>와 같이 이클립스에서 바로 C++ 코드를 편집할 수 있다.

<그림2> 프로그램 소스에서 CCLog 메서드 호출


다음으로 프로젝트를 디버깅 모드로 실행한 뒤, 퍼스펙티브 창을 DDMS로 변경한다.


<그림3> DDMS 선택


<그림4>와 같이 LogCat 창에 “start HelloWorld scene!”이라는 로그가 출력된다.


<그림4> LogCat에 로그 출력


LogCat은 원하는 종류의 로그만 화면에 표시하는 기능인 필터를 지원한다. 만약 cocos2d-x라는 필터가 없다면 새로 만든다. LogCat 좌상단에 있는 녹색 ‘+’ 버튼을 클릭하면 “LogCat Message Filter Settings” 라는 창이 뜬다. 여기서 Filter Name: 에 ‘cocos2d-x’를 입력하고, by Log Tag: 에는 ‘cocos2d-x debug info’라고 입력한다.


<그림5> LogCat 필터 생성

저작자 표시
신고
Creative Commons License
Posted by 가리봉맨

  지난 포스트에서는 이클립스에  C++ 소스 파일 및 플러그인을 추가하고 통합 빌드하는 하는 부분을 다뤘다. 이어서 C++ 소스 파일에 표시되는 경고를 사라지게 함으로써 이클립스에서 C++ 파일을 편집할 수 있도록 해보겠다. 


  jni/helloworld/main.cpp 파일을 열어보면 아래 사진과 같이 경고가 표시되는 것을 볼 수 있다. 이것은 C++ include 파일들의 경로를 제대로 설정해 주지 않아서 나타나는 현상이다. 



  Package Explorer에서 프로젝트를 선택한 뒤 마우스 오른쪽 버튼을 누르고 Properties를 선택한 뒤, C/C++ General -> Path and Symbols -> GNU C++  선택한다. 그리고 아래 두 개의 경로를 추가해 준다.


 $(NDKROOT)/platforms/android-9/arch-arm/usr/include 

 $(COCOS2DX_HOME)/cocos2dx/include


  여기서 $(NDKROOT)와 $(COCOS2DX_HOME)는 각자 실제 디렉토리의 절대 경로로 바꿔줘야 한다. 여기까지 하면 아래와 같이 상당 부분 경고 표시가 사라진다.


  이제 게임 소스에 해당하는 디렉토리 (/Classes)의 경로를 추가해 줘야 한다. 역시 Properties 창을 열고, C/C++ General -> Path and Symbols -> Soruce Location 을 선택한다. 그리고 Link Floder.. 버튼을 누른 다. 그 다음 Link to folder in the file system 을 체크해 주고 Browse 버튼을 눌러서 프로젝트 홈 디렉토리 아래에 있는 /Classes 디렉토리를 선택해 준다.


  여기까지 하면 대부분의 경고 표시가 없어진다. 그래도 남아있는 부분은 C++ Code Analysis 설정을 수정해서 제거하도록 한다. 아래 그림과 같이 Properties -> C/C++ General -> Code Analysis 에서 Syntax and Sematic Errors 항목의 체크를 없애준다.



  C++ 소스 상의 경고 메시지들이 모두 사라진 것을 확인할 수 있다. 이제 이클립스에서도 C++ 소스 파일들을 자유롭게 편집하고 빌드할 수 있게 됐다. 끝.



참고사이트:

http://cocos2d-x.org/

http://www.raywenderlich.com/11283/cocos2d-x-for-ios-and-android-getting-started 

저작자 표시
신고
Creative Commons License
Posted by 가리봉맨

  Cocos2d-x 안드로이드 빌드를 하기 위해서는 두 가지 과정을 거쳐야 한다. 먼저 콘솔에서 c++ 파일들을 빌드하고 그 다음 이클립스에서 JAVA 파일들을 빌드해야 한다. 그런데 이클립스에 플러그인 하나만 설치하면 두 가지 과정을 이클립스에서 한 번에 처리할 수 있다. 또, 이클립스에서 직접 c++ 파일을 편집할 수도 있다.


  그 플러그인이 뭐냐하면 바로 CDT(C/C++ Development Tools) 이다. 해당 플러그인을 설치하기 위해 이클립스 메뉴에서 Help -> Install New Software 를 선택한다. 그리고 work with: 란 옆의 콤보 박스에서 "Indigo - http://download.eclipse.org/releases/indigo" 를 선택한다. 이클립스 버젼이 Indigo가 아니라면 해당 버젼에 맞게 선택해 주면 된다.


  다음으로 programming Languages 카테고리를 선택한 뒤, C/C++ Development Tools 에 체크해 준다. 그리고 Next를 누르고 안내에 따라 설치를 하면 된다.


  

  이제 기존 프로젝트에 C/C++ 프로젝트를 결합하는 일이 남아 있다. 해당 프로젝트를 선택한 뒤, 이클립스 메뉴의 File -> New -> Other에서 C/C++\Convert to a C/C++ Project(Adds C/C++ Nature) 를 선택한다.




  Next 버튼을 누르면 아래와 같은 창이 뜬다. Candidates for conversion: 에서 해당 프로젝트를 선택한 뒤, Project  type:은 "Makefile project"를 선택하고 Toolchains:는 기본 값인 -- Other Toolchain -- 를 선택해 준다.



  Finish 버튼을 누르면 창이 하나 더 뜬다. 이클립스에서 퍼스펙티브(Perspective)란 작업의 종류에 따라 뷰와 에디터가 배치된 세트를 의미한다. 기본적인 안드로이드 관련 셋팅만 해 놓은 상태라면 이클립스 우상단에 Debug, DDMS, Java 퍼스펙티브가 있을 것이다. 여기에 C/C++ 퍼스펙티브를 추가할 것이지 여부를 뭍는 것이다. 일단 No를 선택한다.




  이제 C++ 파일 컴파일을 위한 리눅스 make 명령 실행에 대한 프로젝트 설정을 변경해 줘야 한다.  Package Explorer에서 프로젝트를 선택한 뒤 마우스 오른쪽 버튼을 누르고 제일 아래에 있는 Properties를 선택한 뒤, C/C++ Build 메뉴를 선택한다. 


  다음으로 "Use default build command" 체크박스를 해제한 뒤 Build command: 란을 아래와 같이 채워 준다. "samplecocos2dxandroid" 부분은 각자의 프로젝트명에 맞게 변경해 주면 된다. 이렇게 하면 전에는 콘솔에서 직접 입력하던 build_native.sh 스크립트를 이클립스가 실행해 주게 된다. 참고로 끝에 붙은 'V=1" 옵션은 빌드 명령이 콘솔 화면에 표시되도록 해 주는 역할을 한다.


 bash ${workspace_loc:/samplecocos2dxandroid}/build_native.sh NDK_DEBUG=1 V=1 


  마지막으로 NDK가 설치된 경로를 이클립스에 알려주는 작엄을 해야 한다. 다시 Properties 창을 열고 C/C++ Build 를 더블 클릭해서 하위 메뉴를 펼쳐준다. 여기서 Enviornment를 선택한다. 그리고 Add 버튼을 누르고 NDK_ROOT란 키 값과 다음과 같이 NDK가 설치된 경로를 넣어 준다. 


 /Users/NokNokMobile/Documents/_dev/android-ndk-r7-crystax-5.beta2 




  여기까지 하고 이클립스 메뉴에서 Project -> Build All 을 하면 이클립스 Console 창에 빌드 과정이 찍히면서 C++ 파일들이 정상적으로 빌드되는 것을 확인할 수 있다. 



  하지만 아직 완전히 끝난 것이 아니다. 빌드는 되지만 C++ 파일들에 몇 가지 warnings이 남아 있다. 이 부분에 대한 처리는 다음 편에 계속 하도록 하겠다.



참고 사이트:

http://cocos2d-x.org/

http://www.raywenderlich.com/11283/cocos2d-x-for-ios-and-android-getting-started 

http://stackoverflow.com/questions/12594854/cocos2dx-specific-libraries-cannot-be-resolved-after-creating-android-project-fr

http://okjsp.tistory.com/1165643087

저작자 표시
신고
Creative Commons License
Posted by 가리봉맨

cocos2d-x가 cocos2d-iphone 2.0을 기반으로 한 2.0.x 로 버젼업되면서 템플릿 프로젝트의 구조가 상당히 달라졌다. 기존 cocos2d-x 1.0.x 버젼으로 통합 프로젝트를 만드는 방법에 대한 포스트는 많다. 하지만 위에도 언급했듯이 2.0.x 에서 달라진 부분이 꽤 있어서 그대로 따라 하기에는 무리가 있었다. 


혼자 삽질하면서 겨우겨우 셋팅에 성공하기는 했는데 다른 분들은 이런 삽질을 안 하도록 그 과정을 공유하려 한다. 아래 포스트는 cocos2d-x 1.0.x 기반의 통합 프로젝트 만들기 튜토리얼이다. 그대로 따라하면서 2.0.x와 틀린 부분을 찾아서 고쳐 가면서 새 프로젝트를 만들어 봤다.


Creating an iPhone and Android Cocos2D-x hybrid project (updated) ]


위 튜토리얼은 "1. iPhone 프로젝트 생성 -> 2. Android 프로젝트 생성 -> 3. Android 프로젝트를 iPhone 프로젝트에 통합". 이렇게 3단계로 진행된다. iPhone 프로젝트 생성(1. Creating the iPhone project) 및 Android 프로젝트 생성(2. Creating the Android project) 까지는 그대로 따라하면 된다. 

  

마지막 "Android 프로젝트를 iPhone 프로젝트에 통합(3. merge the Android project into the iPhone project)" 부분은 2.0.x에서 달라진 부분을 고치고 빠진 부분을 덧붙여서 설명해 보겠다.




먼저 vi, nano 등의 편집기를 사용해서 아래 디렉토리에 makefile을 새로 만든다. 

$COCOS2DX_ROOT/SimpleGame/android/


내용은  아래와 같다.

 clean:
     rm -rf libs/

     rm -rf obj/

이 때 rm 앞의 공백은 반드시 탭으로 만들어 줘야 한다. 안 그러면 make 시 에러가 난다.


그리고 미리 컴파일된 라이브러리들을 clean up 해 준다.

 cd $COCOS2DX_ROOT/SimpleGame/android
 make clean





다음으로 안드로이드 프로젝트에 있는 일부 디렉토리 및 파일들을 메인(iPhone) 프로젝트로 복사한다.


첫번째,  $COCOS2DX_ROOT/SimpleGame/ 에서 proj.android 디렉토리를 
SimpleGame/SimpleGame/ 로 통째로 복사한다.


두번째,  $COCOS2DX_ROOT/cocos2dx/ 에서 Android.mk 파일을 
SimpleGame/SimpleGame/libs/cocos2dx/ 로 복사한다.


세번째, $COCOS2DX_ROOT/CocosDenshion/ 에서 android 디렉토리를 
SimpleGame/SimpleGame/libs/CocosDenshion/로 복사한다. 이 때, 이미 iPhone 프로젝트에 해당 디렉토리가 존재하므로 복사하기 전에 먼저 이를 삭제해야 한다.


네번째, $COCOS2DX_ROOT/cocos2dx/ 에서 platform 디렉토리를
SimpleGame/SimpleGame/libs/cocos2dx/ 로 복사한다. 마찬가지로 이미 iPhone 프로젝트에 해당 디렉토리가 존재하므로 복사하기 전에 먼저 이를 삭제해야 한다.


마지막으로 (참고한 튜터리얼에는 빠져 있음) $COCOS2DX_ROOT/extensions/ 에서 Android.mk 파일을 SimpleGame/SimpleGame/libs/extensions/ 로 복사한다. 

그리고 $COCOS2DX_ROOT/extensions/GUI/CCEditBox/ 에서 CCEditBoxImplAndroid.cpp, 
CCEditBoxImplAndroid.h 파일을 
SimpleGame/SimpleGame/libs/extensions/GUI/CCEditBox 로 복사한다.


복사가 모두 끝나면 아래 그림과 같은 모양이 된다. 



iOS(iPhone) 프로젝트와 Android 프로젝트가 같은 프로젝트 루트(SimpleGame)아래 위치해 있는 것을 확인할 수 있다. 또한 libs 디렉토리 아래 있는 cocos2dx 라이브러리도 공유하게 된다.




그리고  proj.android/build_native.sh 파일을 편집한다.

COCOS2DX_ROOT="$DIR/../.." 를 COCOS2DX_ROOT="$DIR/../libs" 로 고쳐 준다.


이제 proj.android/ 디렉토리로 가서 터미널에서 다음을 실행한다.

 make clean

마지막으로 build_native.sh 를 같은 디렉토리에서 실행한 뒤, 컴파일이 성공적으로 끝나는 것을 확인한다. 끝!


저작자 표시
신고
Creative Commons License
Posted by 가리봉맨


티스토리 툴바