Wednesday, November 26, 2014

[Libgdx] 크로스 플랫폼 게임 개발 - 첫번째 이야기

Libgdx은 자바 기반의 오픈 소스 크로스 플랫폼(cross-platform) 게임 개발 프레임워크입니다. Windows, Mac, Linux, Android, iOS, HTML5 등 아주 다양한 플랫폼을 대상으로 게임을 개발할 수 있도록 해주는데요. 단 하나의 코드를 기반으로 그것이 가능하게 한다는 게 아주 매력적이죠. '저수준의, 플랫폼에 종속적인 세부 사항들'을 개발자가 일일이 처리해줘야하는 수고를 덜어 줍니다.

자세한 정보는 http://libgdx.badlogicgames.com을 통해서도 얻을 수 있으니 꼭 찾아보시기 바랍니다
Libgdx는 잦은(혹은 부지불식간에 이루어지는) Garbage Collection으로 인해 처리 속도가 느려지는 문제를 개선하기 위해서 Garbage Collection을 고의적으로 회피하는데 중점을 두고 있을 뿐만 아니라 JNI 랩퍼(wrapper)를 사용하기 때문에 기대한 것 이상으로 놀랄만큼 빠릅니다. 처리속도와 관련해서는 여러분이 모바일 디바이스나 브라우저에 게임을 배포하고자 하는 경우라면 굉장히 중요한 고려 사항이 되겠죠.9 (이 강좌가 Android와 iOS 애플리케이션 개발에 촛점이 맞춰있으니 정말 적절하네요)

게다가, 대부분의 게임 엔진이 하듯 하나의 작업 방식(workflow)를 강요하지 않기 때문에, 여러분이 사용할 컴포넌트를 여러분이 선택할 수가 있습니다.

이번 Libgdx 연재 강좌는 2D 게임 개발에 촛점을 맞춘 다양한 내용들로 진행될 것입니다. 앞으로 추가되는 강좌마다 그 주제에 맞는 레시피가 포함될 것이고, 그 레피시는 Libgdx로 할 수 있는 특정 작업들을 수행하는 방법이 단계별로 설명될 것입니다. 여러분은 이 레시피들을 따라하면서 '그것들이 어떻게 동작하는지', '실제 프로젝트에서는 그 기술들이 어떻게 적용될 것인지'를 알게 될 것으로 기대합니다.




어떤 것들을 살펴보게 되나요?


첫 번째 주제에서는 아래의 것들을 살펴볼 것입니다.

  • 개발 환경 세팅하기
  • 프로젝트를 생성하기
  • 프로젝트의 구조와 애플리케이션 생명주기 이해하기
  • Git을 이용해서 Libgdx 프로젝트 소스를 관리하기
  • Libgdx 공식 데모 애플리케이션을 import 해서 실행하기


움직이는 캐릭터를 스크린에 표현하는 방법을 구상하기 전에, Libgdx를 이용해서 크로스 플랫폼(cross-platform) 애플리케이션을 만드는데 필요한 도구들을 먼저 준비해고, 그 툴들의 기본적인 원리를 이해해야 하겠죠. 이 장의 주된 목적은 그러한 사전 준비라 하겠습니다.

먼저 세 가지의 주된 운영체제(Windows, Mac, GNU/Linux)에서 필요한 것들을 인스톨하는 방법에 대해 다루겠습니다. 여러분이 지금 당장이라도 게임 개발에 뛰어들고 싶어한다는 것은 압니다. 하지만, 나중에 골치 아픈일을 겪지 않기 위해서라도 안정적이면서도 생산적인 환경을 구축해 놓는게 필수입니다. 모두 설치된 후에는 샘플 프로젝트를 이용해서 확실하게 설치되었는지도 확인해 보겠습니다. 그러면서 Libgdx 프로젝트가 어떻게 구조화가 되어 있는지도 좀 더 자세하게 살펴보도록 하겠습니다

종종 개발자들은 Libgdx이나 몇몇 써드 파티 라이브러리의 최신 버전을 사용하길 원합니다. 그것들이 이전 버전에 없던 대단한 특징을 갖기도 하고 밤새워 고민하던 문제들에 대한 해결책을 가지고 있기도 하니까요. 그러한 이유로, 적절한 시기에 프로젝트를 업데이트해서 새로운 버전의 특성들을 제대로 맛볼 수 있도록 준비하는 것은 미래를 위해서도 매우 유용한 것이라 할 수 있습니다.

마지막으로, 여러분들도 이미 알고 계시겠지만, 여러분이 노력해서 작성한 것들 하나하나에 대해 소스 관리를 한다면 혹시나 있을 지도 모르는 최악의 상황에서 여러분을 구하게 될 것입니다. 단순히 백업 시스템을 제공하는 것에 그치지 않고, 변경 사항에 대해서도 세심하게 체크할 수 있고 다른 공동 작업자들과 공유할 수 있게 될테니까요. 뭔가 잘못 동작하고 있는 부분이 발생했을 때, 무엇이 혹은 누가 잘못을 범했는지도 쉽게 찾아낼 수 있고요.

그래서, 소스 관리를 어떻게 효과적으로 할 수 있는지에 대해서도 살펴볼 것입니다. 그 한가지 예로 Git를 이용해서 Libgdx 프로젝트를 관리하는 방법을 보여줄 거예요.



개발 환경을 세팅해 봅시다.


여기에 서술되는 레피시들을 따라해 보는 것으로 여러분은 Libgdx의 맛을 제대로 느낄 수 있을 뿐만 아니라, 지원되는 모든 플랫폼에서 동작하는 게임을 개발하실 수 있게 될 것입니다.

하나 유념해야할 게 있는데요. 대부분의 경우, Libgdx는 오픈 소스 소프트웨어에 의존합니다. 별도의 비용이 들지 않죠. 데스크탑이 되었든, 안드로이드가 되었든, 브라우저가 되었든, 누구든 그것들을 대상으로 애플리케이션을 작성할 수가 있어요. 하지만, 예외가 하나 있죠. iOS에 대해서는 제한됩니다. Mac이 필요하기 때문이죠.

들어가기 전에...

먼저 몇 가지 소프트웨어를 설치해야 하는데요. 제대로 다운로드해서 설치하려면 여러분이 사용하고 계신 운영체제의 버전을 잘 알고 계셔야 합니다. 이 강좌에서서 여러분의 이해를 돕고자 사용되는 이미지들은 모두 Mac OS X 10.10, Yosemite 에서 캡쳐된 것들입니다.  그 외의의 운영체제와 관련된 내용들은 필요한 만큼만 간략히 언급하도록 하겠습니다
지금 이 글을 읽고 있는 순간에도 설치할 소프트웨어 패키지의 새로운 버전이 릴리즈 되었을 수가 있어요. 여기에 설명되는 내용을 가이드라인 정도로만 인식하시고, 달라지는 부분은 실제 그 소프트웨어 패키지를 배포하는 사이트를 통해 알아보셔야할 경우가 있을 것입니다.
필요한 것들을 하나씩 준비하고 설치하자.

아래는 여러분이 설치해야 하는 소프트웨어 리스트입니다. 위 네 개는 안드로이드 개발을 위해서 필수적으로 필요한 패키지들이고, 아래 두 개는 iOS용 애플리케이션 개발을 추가로 하고 싶다면 필요한 것들이죠. (이 강좌는 기본적으로 자바 소스코드 작성이 가능한 분들을 대상으로 한 것이므로, 아래 소프트웨어의 설치방법 등은 생략하는 대신, 주의해야 할 부분에 대해서만 간략하게 언급하도록 하겠습니다)


  • Java Development Kit (설치된  JDK가 Java7이상인지만 확인하시면 됩니다. Java6에서는 동작하지 않거든요.)
  • Eclipse IDE Libgdx 게임 개발하시는 분들이 가장 많이 사용하시는 IDE입니다. 이 강좌에서도 Eclipse를 기반으로 설명할테구요.(물론, IntelliJ IDEA나 Netbeans에서도 가능합니다)
  • Gradle plugin for Eclipse
  • Android SDK (안드로이드 디바이스를 타겟으로 하고 싶다면) 
    Libgdx가 Android 2.2 이후의 버전을 요구하는 것만 기억하시면 됩니다.
  • RoboVM plugin for Eclipse, (iOS를 타겟으로 개발하고 싶다면)
  • XCode (iOS를 타겟으로 개발하려고 하는 Mac 유저라면)

이제부터는 빌드 과정에서 필요한 플러그인과 iOS 타겟을 위한 플러그인입니다. Help | Install New Software 에서 아래 플러인별로 추가된 Update URL을 입력하시면 찾을 수 있습니다.
  • Gradle 
    오픈소스 빌드 자동화시스템입니다. 어떤 면에서는 굉장히 성가시면서도 골치아팠던 프로젝트의 의존성(dependencies) 문제들을 아주 우아하게 처리해줍니다.
    http://dist.springsource.com/release/TOOLS/gradle 
  • Google Plugin for Eclipse
    http://dl.google.com/eclipse/plugin/4.4 (for Eclipse 4.4 Luna)
  • Developer tools for Android
    http://dl.google.com/eclipse/plugin/4.4
  • Google Web Toolkit SDK(브라우저를 타겟을 한다면 필요합니다
    http://dl.google.com/eclipse/plugin/4.4
  • RoboVM for iOS(iOS를 타겟으로 한다면 필요합니다)
    http://download.robovm.org/eclipse







제대로 설치되었는지 확인은 해봐야겠죠?

이제 제대로 세팅이 되어 개발을 시작할 준비가 되었는지 확인해봐야하겠죠? 아직은 우리가 작성한 프로젝트가 없으니 Libgdx의 공식 데모 프로젝트를 다운로드해서 테스트 해볼까요?

A. Desktop 애플리케이션 실행


1. 다음 링크를 따라가서 (Link: https://github.com/libgdx/libgdx-demo-superjumper ) 화면 오른쪽 중앙에 보이는 Download Zip 버튼을 눌러 다운로드한 후 압축을 풀어줍니다. 아래 그림에 보이는 구조를 하고 있을 거예요.



2. 이클립스에서 File | Import... 후에 import 윈도우가 나타나면 Gradle | Gradle Project를 선택하고 Next버튼을 클릭합니다. 아래 화면처럼 나타날 거예요.




오른쪽 상단의 Build Model 버튼을 누릅니다. 하지만, 지금 상태에서는 작업을 마치지 못하고 아래와 같은 에러창이 뜰 수 있어요.
압축해제한 디렉토리에 local.properties 파일이 없기 때문인데요. 그 파일을 만들어주면 됩니다. 그리고 파일안에 아래처럼 작성해주세요. 여기서 /andorid_sdk는  Android SDK가 설치된 실제 경로입니다
     
      sdk.dir=/android_sdk 


파일을 만들어준 후에 다시 Build Model 버튼을 클릭하시면, 에러없이 빌드될 것입니다.  ** 가끔은 'Periodic workspace save.' has encountered a problem 어쩌고 하는 에러가 발생하기도 하던데요. workspace를 임시로 하나 만들어 스위칭 해준 다음에 다시 현재 workspace로 돌아오면 사라지더군요.

3. 아래처럼 프로젝트 리스트가 보이게 되면, 원하는 프로젝트를 선택해줍니다. 그림에서는 core, desktop, android, ios 프로젝트만 import 하기려고 합니다. gwt는 제 관심사가 아니거든요. 선택이 되면 Finish 버튼을 누르세요.



4. 이클립스의 Package Explorer를 보면 아래 그림처럼 import 되어있을 거예요. 그럼 Super Jumper-desktop을 선택한 후 마우스 오른쪽 버튼을 눌러 properties를 선택합니다.
그리고, 왼쪽 메뉴들에서 Run/Debug Settings를 선택하세요.(아무런 값이 없을테니 New 버튼으로 새로 하나 생성하시면되고, 혹시나 없으면 Edit를 하면 되겠죠?)

그리고, 아래 그림처럼 각각 값을 입력/선택해줍니다.

  • Name : Super Jumper Desktop
  • Main class : (목록에서 com.badlogicgames.superjumper.desktop.DesktopLauncher를 찾아 선택해줍니다)




5. 그리고, 방금 설정된 Run Configuration으로 실행하시면 됩니다. Run As... | Java Application 해도 뭐 상관은 없습니다만... 아무런 이상이 없으면 아래 그림과 같은 간단한 게임이 실행될 거예요. (설치하고 테스트 하느라 고생하셨으니 잠시 게임을 즐겨보세요. 두 번째와 세번째 그림은 각각 Android, iOS(ipad) 실행 화면이예요.)




B. 안드로이드 애플리케이션 실행


데스크탑 애플리케이션과 마찬가지로 우선 Run Configuration을 생성하고, 몇 가지 설정을 해준뒤 실행하면 됩니다. 저는 Genymotion을 설치해서 사용했습니다.

1. Run | Run Configuration... 으로 Run Configurations 윈도우를 열고, 좌측 맨위에 있는 Android Application을 더블 클릭해서 새로운 항목을 생성합니다. 그리고 Project항목에 원하는 프로젝트를 Browse...로 찾아서 선택해줍니다.




그리고, Target 탭을 선택하면 아래처럼 보일텐데요. 안드로이드 디바이스가 USB로 연결되어 있든지, AVD를 기동시켜 놓았는지에 따라 거기에 맞게 체크해주시면 됩니다. 저는 아까 말씀드린데로 Genymotion을 이용해서 AVD를 하나 활성화 시킨 상태이기 때문에 두번째(Launch on all compatible devices/AVD's)를 체크하고, Active Devices and AVD's를 선택했습니다. ( Active Devices and AVD's / Active AVD's / Active Devices 이렇게 세 개 항목이 있어요 )



그리고, 실행(Run) 시키면 되는데요. 결과 화면은 위에 있는 그림과 같습니다. (Genymotion  Galaxy Note 3 / Android 4.4.2 API 19 , 아래에 작게 Free for Personal Use라고 써있네요.)




C. iOS 애플리케이션 실행


iOS 애플리케이션도 비슷한 방법으로 실행할 수 있지만, 그전에 Xcode가 설치되어 있어야겠죠? 현재 RoboVM 버전이 Xcode 6, iOS Simulator 8.1까지 지원한다고 하니 다행이지 않습니까? 아래 그림들도 RoboVM for Eclipse(1.0 alpha 4)를 이용해서  iOS Simulator 8.1 에서 실행한 모습입니다.

먼저 Run Configuration을 설정해줘야겠죠?  다른 플랫폼에 대한 설정처럼 새로 항목하나를 생성해줍니다. 우린 iOS Simulator를 이용할 것이니 iOS Simulator App에 해당하게 만들어줘야겠죠? 그리고 , 프로젝트도 설정해주고, Device type도 지정해 주시면 됩니다.


실행하게 되면, 약간(?)의 빌드 시간이 걸리구요. 기다리시면 실행이 될 겁니다.
빌드 후에 힙 공간이 부족해서 실패하게 되더라도 다시 하시면 됩니다. 현 시점에서는 처음 빌드할 때 그런거 같네요. 그 이후론 무난합니다. 아래는 iPad Air, iOS 8.1을 대상으로 실행한 화면입니다.



LibGDX 엿보기


Libgdx 개발환경을 설치하는 과정에 대해선 더 이상 부연할 게 없을 거 같네요. 버전도 맞고, 제대로 하나하나 설치했다면 별문제는 없으리라 생각됩니다. 
이제는 크로스 플랫폼 개발을 가능하도록 어떻게 디자인 되었는지, 어떤 기술에 기대어 가능하게 된 것인지 조금은 자세히 알아봐야 할 거 같아요. 적어도 왜 이리 많은 것들을 설치해야 했는지 정도는 알아야 하지 않겠어요?

Libgdx는 사용자들이 (플랫폼에 얽매이지 않는) 자바 코드를 한번 작성하면 , 동일한 동작을 하면서도, '지원되는 모든 플랫폼'에 각각 배포할 수 있도록 해주는, 멀티플랫폼 API를 가지고 있습니다.  모든 플랫폼에 대해서 저수준의 서브시스템을 구현하고 있는 백엔드(backend)도 가지고 있습니다. (그림 참조)

이런 방법으로 여러분은 스프라이트를 스크린에 그리도록 요청할 수도 있고, 배경음악이 재생되게 할 수도 있고, 텍스트 파일을 읽어올 수도 있어요. 공통된 graphics, audio, file 인터페이스를 통해서 말이죠. 놀라운건 원하는 어디에서든 그게 가능하다는 거예요.



Android, iOS, HTML5 같은 플랫폼에 애플리케이션을 배포하는 것을 누구보다 빠르게 처리할 수 있다고는 할 수 없지만, 데스크탑 백엔드를 디버깅 플랫폼으로 활용할 수 있다는 점은 충분히 어필할만한 요소랍니다. Libgdx에 친숙해질 수록 더욱더 그러할 거예요.

그림에 표시된 각각의 백엔드에 대해서 간단히 살펴볼까요?

데스크탑 백엔드는 대부분 LWJGL(Light Weight Java Game Library)에 의존하는데요. 동시에 LWJGL은 OpenGL위에 구축되어 있어요.

안드로이드 애플케이션을 개발할 때에는, Libgdx는 필요한 자원들을 Android SDK뿐만아니라 OpenGL ES(임베디드 시스템에 적합한 OpenGL 버전)에서도 찾게되죠.

HTML5를 지원할 때에는 기술이 아예 다른 것들이기에 조금 까다롭습니다. HTML5는 WebGL과 JavaScript를 이용해서 시각적으로 멋진 애플리케이션을 만들어 보여줄 수 있지만, 불행하게도, Libgdx의 툴체인(toolchain)과는 거의 관련이 없어요. 브라우저간의 호환성은 Google Web Toolkit(GWT)을 통해  이루어지죠. 고맙게도 GWT는 자바코드를 최적화된 자바 스크립트 코드로 컴파일하거든요.

마지막으로 중요한 것 하나. iOS 지원과 관련된 것인데요. 이것은 RoboVM에 의존합니다. RoboVM은 오픈 소스 소프트웨어이면서도 아주 대단한 녀석으로, 자바코드를 가져다가 네이티브 ARM,  x86 코드로 뱉어내거든요. 게다가 iOS 디바이스에 애플리케이션을 배포할 수 있도록, 모든 Cocoa Touch API에 대한 접근이 가능하게 해줍니다.


이 외에도 더 많은 기술들이 포함되어 있죠. 하지만, 앞서 말했듯 간단 보기이니만큼 여기까지만 언급하도록 하겠습니다. 더 자세한 내용은 나중에 개별적으로 볼 기회도 있을테고, 언급하지 않는 내용은 Libgdx공식 홈페이지에서 살펴보시면 될거예요.

자, 이제 우리의 첫 번째 프로젝트를 만들러 가 봅시다! (첫 번째 이야기 끝)





No comments:

Post a Comment