setup-x86.exe (혹은 setup-x86_64.exe)를 실행하여 설치를 진행한다. 설치 과정 중 나머지는 default로 하여도 무방하나, 패키지 선택시 Devel 항목 밑에 make 패키지 옆에 Skip을 눌러 최신 버전이 표시되어 해당 패키지가 설치되도록 한다.
설치 후, setup-x86.exe을 다시 실행하여 설치된 항목을 확인해보면, 아래와 같이 관련 패키지가 함께 설치되어 있는 것을 볼 수 있다.
환경 설정
NDK_ROOT 환경 변수를 추가하고, 압축 푼 Android NDK의 루트 경로(파일들이 존재하는 경로)를 그 값으로 입력한다.
Cocos2d-x를 윈도우에서 빌드하다보면, 주 개발 환경이 Mac OS로 맞춰져있는 탓으로 보이는 몇가지 문제가 발생한다. 다음은 그 문제점 해결을 위한 작업이다.
<Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/proj.android 밑에 build_native.sh 파일을 텍스트 편집기로 열고, 마지막에 다음 명령을 추가한다.
chmod 777 -R "$APP_ANDROID_ROOT"/assets
이 작업을 하지 않는다면?
이 작업을 하지 않을 경우, 안드로이드 앱 빌드시에 다음과 같은 에러를 보게 될 것이다.
(skipping file '.gitignore' due to ANDROID_AAPT_IGNORE pattern '.*') Unable to add
'C:\tools\cocos2d-x-2.2.5\samples\Cpp\HelloCpp\proj.android\assets\fonts\Marker
Felt.ttf': Zip add failed ERROR:
unable to process assets while packaging
'C:\tools\cocos2d-x-2.2.5\samples\Cpp\HelloCpp\proj.android\bin\resources.ap_' ERROR: packaging of
'C:\tools\cocos2d-x-2.2.5\samples\Cpp\HelloCpp\proj.android\bin\resources.ap_'
failed
이 방법만으로 해결이 되지 않을 경우, <Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/Resources/fonts 밑에 있는 파일들을 삭제하고, 빌드 과정을 처음부터 다시 해본다.
2. C++ 코드 컴파일
1) Cygwin을 실행 후, <Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/proj.android로 이동한다.
cd <Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/proj.android
2) build_native.sh를 실행한다.
./build_native.sh
이 과정을 통해, 앱 코드와 Cocos2d-x 라이브러리 코드 모두 빌드되며, <Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/Resouces 밑에 있는 리소스 파일들이 <안드로이드 프로젝트 폴더>/assets로 복사된다.
3. 안드로이드 앱 빌드
1) Eclipse를 실행한다.
2) 다음 두 위치에서 프로젝트를 import한다.
<Cocos2d-x 설치 경로>/cocos2dx/platform/android/java
<Cocos2d-x 설치 경로>/samples/Cpp/HelloCpp/proj.android
3) HellopCpp 프로젝트의 속성을 열고, C/C++ Build 항목을 선택하고, build command의 내용을 cmd로 바꿔준다.
관련 에러: Cannot run program "bash": Launching failed
4) libcocos2dx -> HelloCpp 프로젝트 순으로 빌드한다.
5) 빌드된 앱을 실행하면 다음과 같은 샘플 프로그램을 볼 수 있다. 애뮬레이터(AVD)에서 실행할 경우에, 애뮬레이터 속성 중 Use Host GPU 옵션이 켜져있어야 한다.
def my_draw_polygon(polygon, body, fixture): vertices=[(body.transform*v)*PPM for v in polygon.vertices] vertices=[(v[0], SCREEN_HT-v[1]) for v in vertices] pygame.draw.polygon(screen, colors[body.type], vertices) polygonShape.draw=my_draw_polygon
def my_draw_circle(circle, body, fixture): position=body.transform*circle.pos*PPM position=(position[0], SCREEN_HT-position[1]) pygame.draw.circle(screen, colors[body.type], [int(x) for x in position], int(circle.radius*PPM)) circleShape.draw=my_draw_circle
prismaticJoint.__SetMotorSpeed(15)
running = True while running: for event in pygame.event.get(): if event.type == QUIT: running = False continue if event.type == KEYDOWN and event.key == K_ESCAPE: running = False continue
screen.fill((0, 0, 0, 0))
for body in world.bodies: for fixture in body.fixtures: fixture.shape.draw(body, fixture)
def my_draw_polygon(polygon, body, fixture): vertices=[(body.transform*v)*PPM for v in polygon.vertices] vertices=[(v[0], SCREEN_HT-v[1]) for v in vertices] pygame.draw.polygon(screen, colors[body.type], vertices) polygonShape.draw=my_draw_polygon
def my_draw_circle(circle, body, fixture): position=body.transform*circle.pos*PPM position=(position[0], SCREEN_HT-position[1]) pygame.draw.circle(screen, colors[body.type], [int(x) for x in position], int(circle.radius*PPM)) circleShape.draw=my_draw_circle
revoluteJoint.__SetMotorSpeed(15)
running = True while running: for event in pygame.event.get(): if event.type == QUIT: running = False continue if event.type == KEYDOWN and event.key == K_ESCAPE: running = False continue
screen.fill((0, 0, 0, 0))
for body in world.bodies: for fixture in body.fixtures: fixture.shape.draw(body, fixture)
def my_draw_polygon(polygon, body, fixture): vertices=[(body.transform*v)*PPM for v in polygon.vertices] vertices=[(v[0], SCREEN_HT-v[1]) for v in vertices] pygame.draw.polygon(screen, colors[body.type], vertices) polygonShape.draw=my_draw_polygon
def my_draw_circle(circle, body, fixture): position=body.transform*circle.pos*PPM position=(position[0], SCREEN_HT-position[1]) pygame.draw.circle(screen, colors[body.type], [int(x) for x in position], int(circle.radius*PPM)) circleShape.draw=my_draw_circle
running = True while running: for event in pygame.event.get(): if event.type == QUIT: running = False continue if event.type == KEYDOWN and event.key == K_ESCAPE: running = False continue
screen.fill((0, 0, 0, 0))
for body in world.bodies: for fixture in body.fixtures: fixture.shape.draw(body, fixture)