29. 물리엔진 & 타일맵 사용하기

이번 시간부터는 조금 더 고급게임?을 만들 수 있도록 물리 엔진을 활용하는 방법에 대해 알려 드리겠습니다.

물리 엔진을 사용하기 위해 Box2D extension을 libs 폴더에 넣어 줍니다.(타일맵 사용을 위해 TiledMap extension도 같이 폴더에 넣어 주겠습니다.) library 추가 후에는 항상 File -> Sync Project with Gradle files 실행해 줍니다.

이것으로 물리엔진 및 타일맵 사용을 위한 세팅은 완료되었습니다. 다음은 타일맵 사용법에 대해 설명해 드리겠습니다.

Tiled(mapeditor.org)

타일맵을 만들기 위해 Tiled 라는 툴을 다운받아 사용합니다.

Tiled 설치 후 실행 -> New Map 클릭

format -> Base64(zlib compressed) 를 선택하고, 만들고자하는 타일의 수, 한 타일의 픽셀 입력후 Save As… 클릭 -> 파일 이름 입력

타일맵이 만들어 지면 New Tileset… 클릭

Browse.. 를 눌러 타일맵 만들 때 사용할 타일셋 이미지를 불러와 Save As… 클릭

위와 같이 타일맵을 눌러 본격적으로 타일 맵을 작성합니다.

타일 맵을 그리는 방법은 오른쪽에서 타일셋을 골라 상단에 채워 넣는 방법을 선택하고 그림그리듯이 타일 맵을 채우고 타일맵 완성 후 저장해 줍니다.

하지만 지금 상태로 사용하면 에러가 발생하는데 이것은 AndEngine은 개발이 중단 되었지만 Tiled 는 지금되 계속해서 업데이트가 되고 있기 때문에 tmx 파일의 포맷이 달라서 그런 것 같습니다.(?) 만들어진 tmx 파일을 에디터를 이용해 열어 보면 위와 같이 xml 포맷인 것을 알 수 있는데, 제가 참고했던 책의 예제와 비교해보니 3번째 라인의 포맷이 다른 것을 발견했습니다.

위와 같이 책소스를 참고해 tmx 파일을 수정해 주면 정상적으로 사용하실 수 있습니다.

assets 폴더에 tmx 폴더를 만들고 위에서 수정한 tmx 파일을 넣어주고, 타일셋 이미지는 gfx 폴더에 넣어 줍니다.

게임 엑티비티에 TMXTiledMap을 선언해 주고

onCreateScene() 메서드에 위와 같이 작성

게임을 실행해 보면 위와 같이 조금 전 만든 타일맵이 화면에 보여 지는 것을 확인하실 수 있습니다.

안드로이드 스튜디오 소스

완성된 게임(Hammer King)

28. 장애물 만들기

이 게임에서는 달리다 보면 곰이 출현하고 케릭터는 점프를 통해 곰을 피하거나 피하지 못하면 게임이 끝나도록 하였습니다.

케릭터와 유사하게 GameObject를 상속받는 Bear 클래스를 만들고, 시간이 지날수록 곰이 빨리 달리도록 위와 같이 작성해 줍니다.

달리기 버튼 누르다보면 곰이 출현하도록게임 Activity에 달리기 버튼 안에 Math.random()을 이용해 랜덤한 시점에 곰이 출현하도록 위와 같이 작성해 줍니다.

충돌 감지를 위해 scene.registerUpdateHandler() 메서드 안에 위와 같이 충돌 조건 및 충돌시 처리할 내용을 작성해 주면 됩니다.

안드로이드 스튜디오 소스

assets

완성된 게임(Finger Runner)

27. 케릭터의 점프 구현

이번 시간에는 케릭터의 점프를 구현해 보겠습니다.

AnimatedSprite를 상속 받는 GameObject라는 추상 클래스를 새로 만듭니다.(앞으로 이 클래스를 이용해 케릭터 및 케릭터를 공격하는 동물등 게임 오브젝트를 만들 것입니다.)

게임 오브젝트를 상속받는 Player class를 만들고, 점프시 올라갈 때 속도 내려올 때 속도 점프 높이 등을 선언해 줍니다.

move() 메서드안에 jump() 메서드 실행되도록 입력하고 jump() 메서드를 작성해 줍니다.(자세한 코드는 아래 소스 참고하십시오.)

점프시 위와 같이 케릭터가 회전하는 효과를 줄 수 있습니다.

점프시 사용할 이미지는 위와 같이 2장으로 된 animation 이미지를 사용하겠습니다.

게임 activity 에 animation 이미지 사용시 TiledTextureRegion을 선언해 줍니다.

onCreateResources() 메서드에 위와 같이 tiledTextureRegion을 정의시 animation의 column과 row의 갯수를 입력해 줍니다.

점프 케릭터 및 점프 버튼을 위와 같이 작성해주면 점프 버튼 클릭시 점프하는 케릭터를 구현하실 수 있습니다.

안드로이드 스튜디오 소스

assets

완성된 게임(Finger Runner)

26. 움직이는 배경 화면

이번 시간 부터는 새로운 예제 게임(핑거 러너)를 가지고 지금까지 설명해 드린 것외의 새로운 AndEngine 기능 위주로 설명 드리겠습니다.

가장 먼저 소개해 드릴 기능은 움직이는 배경 화면 입니다.

일반적인 이미지를 불러오는 방법과 동일하게 배경화면 으로 사용할 이미지를 불러 옵니다.

onCreateScene() 메서드안에 AutoParallaxBackground를 이용해 위와 같이 작성해 주면 움직이는 배경화면을 구현하실 수 있습니다. pParallaxFactor 값을 변경해 배경이 움직이는 방향과 속도를 조절하실 수 있습니다.

안드로이드 스튜디오 소스

assets

완성된 게임(Finger Runner)

25. 구글 플레이 64비트 요구 사항 준수

저의 경우 AndEngine 을 이용해 게임 완성 후 구글 플레이 등록시 심한 멘붕을 격었습니다.

바로 위와 같이 힘들게 만든 게임이 64비트 요구 사항을 준수하지 않아 등록이 불가능하다는 것이 었습니다. 그래서 구글링을 해서 찾아 보니 다행히 해결책을 찾을 수 있었습니다.

Gradle Scripts -> build.gradle(Module: app) 에 위와 같이 작성 후 Sync Now를 누르고 앱을 빌드하면 오류가 사라져 정상적으로 게임 등록이 가능해 집니다.(구글링을 해보니 문제가 되는 32비트 네이티브 코드는 사용이 안 되니 제외 시키면 된다 뭐 그런 내용이었습니다. -> 저도 초보라 100% 이해를 못해 설명이 허접한 점 이해 부탁합니다.)

이로써 게임 한개를 완성해 봤습니다. 다음 시간부터는 Finger Runner 라는 게임을 예제로 지금까지 다루지 않았던 AndEngine 기능을 중심으로 설명 드리겠습니다.

안드로이드 스튜디오

HttpClient libs

assets

완성된 게임

1) Animal Cards

2) Finger Runner

24. 광고 추가(AdMob)

이번 시간에는 게임에 광고를 넣어 수익화할 수 있는 방법을 알려 드리겠습니다.

Gradle Scripts -> build.gradle(Module: app) -> dependencies에 우와 같이 AdMob library를 추가해 주고

multiDex를 지원하도록 위와 같이 입력 후 Sync now를 눌러 줍니다.

AdMob에 접속해 앱을 추가하고 본인의 app ID 발급 받습니다.

manifest에 본인의 app ID를 입력해 줍니다.

광고로 사용할 일반적인 안드로이드 activity를 추가하고, activity를 manifest에도 추가해 줍니다.

위와 같이 광고 종류에 따른 광고 단위 ID를 입력해 줍니다.(여기서는 메인 메뉴에서 게임 시작을 눌렀을 때 광고 화면을 보여 준 후 게임을 시작하도록 전면 광고를 사용했습니다.)

광고 로딩이 끝나면 광고가 재생되도록 위와 같이 작성해 주고

광고를 클릭했을 때와 광고를 닫았을 때 게임 Activity로 돌아가도록 위와 같이 작성해 줍니다.

게임 시작 버튼을 눌렀을 때 광고 Activity가 실행되도록 MainActivity 를 수정해 줍니다.

test ID를 이용하거나 Virtual Device에서는 위와 같이 테스트 광고가 나오지만, 실제 폰에서는 일반 광고가 보여 집니다. 여기에서 주의해야할 것이 있는데, 개발자가 자기 광고를 클릭하거나 링크를 다른 사람에게 보내 클릭을 유도하면 AdMob 계정이 정지될 수 있으니 실수로라도 실제 광고를 클릭하지 않도록 조심해야 합니다.

안드로이드 스튜디오 소스

HttpClient libs

assets

완성된 게임

1) Animal Cards

2) Finger Runner

23. 웹뷰를 이용한 랭킹 화면 만들기

이번 시간에는 지난 시간에 만든 게임 기록 확인 PHP 파일을 웹뷰를 이용해 앱에서 볼 수 있도록 만들어 주겠습니다.

안드로이드 일반적인 Activity를 만들어 지난 시간 작성한 게임 기록을 확인하는 PHP 파일을 웹뷰에서 보이게 만들어 줍니다.

RankingActivity에 마우스 크릭 후 Alt + Enter 를 눌러 드롭다운 창이 뜨면 Add activity to manifest 클릭

웹사이트를 보여줄 webview를 선언해 주고, 작성한 PHP 파일이 있는 url을 입력해 줍니다. 메인 메뉴로 돌아가는 버튼도 1개 추가해 줍니다.

MainActivity에 가서 ranking button 클릭시 RankingActivity로 이동하도록 작성해 줍니다.

게임을 실행하고 ranking 버튼을 누르면 위와 같이 게임 기록이 저장된 화면을 보실수 있습니다.

안드로이드 스튜디오 소스

assets

HttpClient libs

완성된 게임

1) Animal Cards

2) Finger Runner

22. PHP를 이용한 게임 기록 확인

이번 시간에는 DB에 저장된 게임 기록을 PHP를 이용해 확인하는 방법에 대해 알려 드리겠습니다. DB에 저장된 게임 기록을 확인해 보기 위해 phpMyAdmin을 이용합니다. 아래 링크에서 다운 받으시면 됩니다.

phpMyAdmin

phpMyAdmin을 이용해 DB에 저장된 게임 기록을 확인하실 수 있습니다. DB에 저장된 게임 기록을 확인할 수 있도록 PHP 파일을 만들어 주겠습니다.

DB 연결 부분은 지난번 saveScore.php와 동일하게 작성하시면 되기 때문에 생략하겠습니다.

SQL 내용을 위와 같이 작성해 줍니다.

이 후 PHP와 HTML(CSS & JS)을 이용해 테이블을 예쁘게 꾸며주시면 됩니다.(자세한 것은 아래 첨부된 소스 참고하십시오.)

작성한 PHP 파일을 서버에 올려서 열어보면 위와 같이 게임 기록이 저장된 테이블을 확인하실 수 있습니다.

PHP 소스

완성된 게임

1) Animal Cards

2) Finger Runner

21. PHP를 이용한 게임 기록 DB에 저장

이번 시간에는 지난 시간 작성한 PHP 파일을 이용해 게임 기록을 DB에 저장하도록 GameActivity를 수정해 보겠습니다.

지난 번에 게임 플레이 시간을 보여 주기 위해 작성했던 registerUodateHandler() 메서드 안에 게임 기록을 저장하는 saveScore()라는 메서드를 넣어 줍니다.

saveScore() 라는 메서드를 위와 같이 작성하고 게임 기록을 DB에 저장하는 saveRecord() 메서드도 넣어 줍니다.

앱에서 웹서버에 접속하기 위해 HttpClient library가 필요합니다. 아래 링크에서 다운로드 받으시면 됩니다.(처음에 최신 버전인 5.0으로 시도해 봤는데 명령어 같은 게 바뀌었는지 안되서 아래 4.5.12 버전을 사용했습니다. -> 제가 서버관련해서는 아는게 별로 없어 이렇게 저렇게 시도해 보다 찾은 방법이라 설명이 부족한 점 이해 부탁 드립니다.)

Apache HttpClient 4.5.12 download

다운 받은 파일의 압축을 풀어서 나온 파일을 app -> libs 파일에 넣어 줍니다.

새로운 library 추가 후에는 file -> Sync Project with Gradle Files 를 눌러 줘야 사용이 가능합니다.

saveRecord() 메서드를 위와 같이 작성해 주고 지난 시간에 만든 PHP 파일을 서버에 업로드하고 url을 입력해 줍니다.

나머지 필요한 메서드들도 작성해 줍니다. makeHttpPost() 메서드에 params.add() 작성시 name 은 PHP와 동일하게 맞춰 주셔야 합니다.

게임이 인터넷 연결이 가능하도록 AndroidManifest.xml에 INTERNET permission을 추가해 줍니다.

현재 상태에서 앱을 실행해 보면 위와 같이 에러가 발생하는데

build.gradle(Module: app) 에 packagingOptions에 위 내용을 추가해 주면 게임이 정상적으로 실행되는 것을 확인하실 수 있습니다.

이제 게임 기록을 DB에 저장할 수 있게 되었습니다. 다음 시간에는 DB에 저장된 게임 기록은 볼 수 있도록 PHP 파일을 만들어 보겠습니다.

안드로이드 스튜디오 소스

assets

완성된 게임

1) Animal Cards

2) Finger Runner

20. 랭킹 매뉴 만들기(PHP 이용)

이번 시간에는 게임 기록을 서버에 저장하고 서버에 저장된 기록을 웹 페이지에 표시해 webview를 이용해 앱에서 볼 수 있도록 만들어 보겠습니다. 저의 경우 이 부분에서 책이 옛날 책(2003년)이다 보니 책대로 되지 않아 가장 많이 헤맸습니다. 다른 분들은 저처럼 헤매지 않았으면 하는 마음에 이 가이드를 작성하게 되었습니다.

이 내용을 이해하기 위해서는 PHP, SQL, HTML(CSS & JavaScript) 대해 조금 알고 있는 것이 좋습니다. 이런 내용에 대해 제 설명이 부족해(저도 자세히 설명해 드리고 싶지만 저도 지식이 부족해서 자세히 설명 못해드리는 점 양해 바랍니다.) 이해가 가지 않는 내용이 있으시면 이전에 소개해드린 생활코딩 이라는 사이트에서 무료로 학습이 가능하오니 참고하십시오.

먼저 게임 기록을 저장하는 DB 서버를 구축해야합니다. 저의 경우는 이미 웹호스팅 서비스를 이용하고 있어서 그걸 그대로 이용했습니다. 직접 자신의 컴퓨터를 DB 서버로 만들려면 생활코딩 PHP 설치 강의를 참고하십시오.

DB 서버 구축 후 게임 기록을 저장할 DB와 table을 만들고, 게임 데이터를 서버에 저장하는 PHP를 작성합니다. 코드 작성시 특별히 선호하는 editor가 없으신 분들은 간단히 코드 작성하기 좋은 MS에서 만든 Visual Studio Code 추천 드립니다.

먼저 DB 접속 부분을 먼저 작성합니다. username, password는 보안에 관련된 내용이라 외부에 공개되지 않도록 주의합니다.

SQL을 이용해 DB table에 값을 쓸 수 있도록 작성해 줍니다.

다음 시간에는 게임으로 돌아가 이 PHP 파일을 이용해 게임 기록을 서버에 쓸 수 있도록

PHP 소스

완성된 게임

1) Animal Cards

2) Finger Runner