상세 컨텐츠

본문 제목

JetBoy 따라하기 #9 - 마무리

프로그래밍/Android

by ryujt 2010. 12. 28. 23:30

본문

지금까지 JetBoy 따라하기라는 제목으로 강좌를 하면서 실제로는 전혀 다른 게임을 만들어 버렸습니다.  사실 첨부터 JetBoy의 리소스만을 사용해서 현재의 스타일의 게임을 만드는 것이 목표였습니다.

이제 지금까지 거쳐온 내용을 간략하게 정리하고 이번 강좌를 마무리하려고 합니다.

이번 강좌 이후에 저는 잠시 휴지기를 가지려고 합니다.  미리 만들어 둔 게임은 몇 가지 더 있으니 계속 관심을 가져주시기 바랍니다.



구조 분석


[그림 1] 프로그램 전체에 대한 Class Diagram

[그림 1]은 지금까지 만들어 온 프로그램의 간략하게 표현된 Class Diagram 입니다.  논리적인 의미의 구성일 뿐 실체 코드와는 다소 차이가 있습니다.

우선, GameControl 또는 GameControlBase에서 상속받은 클래스의 객체들은 모두 GamePlatform의 구성원입니다.  그럴 수 밖에 없는 것이, GamePlatform이 하는 일이 게임 컨트롤 객체들을 그려주는 일을 하고 있기 때문입니다.  하지만, 논리적인 측면에서는 특별하게 고려해야 할 대상이 아니기 때문에 Class Diagram에서는 생략하였습니다.

또한, 리소스에 관련된 클래스들도 논리적인 측면에서는 고려 할만한 요소가 없기에 마찬가지로 Class Diagram에서 생략하였습니다.

게임 컨트롤에 관련된 클래스는 아래와 같습니다.  그리고, 아래의 목록 중에서 Asteroids와 Lasers는 화면에 표시되는 객체는 아니고 논리적으로 필요해서 만들어진 객체입니다.  정확하게는 게임 컨트롤이 아니긴 하지만, 주기적으로 객체가 그려져야 할 때, 작용해야 하는 기능이 있기 때문에 GameConrol 클래스를 상속하여 구현하였습니다.

즉, 실제 게임 컨트롤과 관련있는 객체는 굵은 글자로 표시된 네 가지 종류의 클래스의 객체들 뿐 입니다.
  • Background 
  • Asteroids 
  • Asteroid 
  • Ship 
  • Lasers 
  • Laser

JoyStick의 경우에는, Ship 클래스의 멤버보다는 GamePlaform과 동등한 위치에서 설계하는 것이 자연스러울 수도 있습니다.  하지만, 우리가 작성한 예제에서는 Ship 이외의 다른 클래스에서 참조하는 일이 없기 때문에, Ship 클래스의 내부 멤버로 구성하였습니다.



동적 분석

[그림 2] 동적 분석 (Job Flow)

 [그림 2]는 프로그램을 구성하는 주요 객체들 사이에 발생하는 메시지의 흐름을 분석한 내용입니다.
  • GamePlaform에서 주기적으로 모든 게임 컨트롤 객체의 onTick 메소드를 실행하여 각각 필요한 작업을 수행합니다.  마치 OS가 멀티 테스킹을 위해서 시간을 쪼개서 분할 작업하는 것과 같습니다.
  • GamePlaform은 onTick과 마찬가지로 주기적으로 onDraw를 발생시킵니다.  onTick과 onDraw는 차이가 없지만 실행 순서가 onTick이 빠르며, 그리기 코드를 깔끔하게 분리하고 싶어서 두 메소드로 나누었습니다.
    • Ship 객체는 자신이 그려져야 할 좌표를 JoyStick 객체에게 의존해서 가져옵니다.
    • Ship(우주선) 객체의 경우 Asteroid(소행성) 객체들과 충돌 테스트를 해서, 충돌이 감지되면 해당 Asteroid 객체를 폭발(Explode) 시키고, Ship 객체는 삭제합니다.  [그림 2]에서는 Asteroid를 생략하고, Asteroids 객체에 함께 표기하였습니다.
    • Laser 객체도 Ship 객체와 마찬가지로, Asteroid 객체와의 충돌 검사 이후, 충돌이 감지되면 Laser  객체는 삭제하고, Asteroid 객체는 폭발 시킵니다.
  • 모션 이벤트가 발생하면 모든 게임 콘트롤 객체의 onTouchEvent 메소드를 실행합니다.
    • 우리가 작성한 예제에서는 Ship 객체만이 onTouchEvent  메소드를 정의하였기 때문에, Ship 객체만이 이 메시지를 사용하게 되며, 무조건 Lasers의 Fire 메소드를 실행합니다.
동적 분석 내용을 보시면서 지금까지 작성해온 코드를 다시 한 번 더듬어 보시기 바라면서, 아울어 이제 직접 코드를 작성 할 수 있을 때까지 반복해보시기를 당부합니다.  학습에 있어서 반복만큼 좋은 훈련은 없습니다.  

"아!  알것 같아.", "완전히 이해했어!" 와 같은 것들은 실제 실력을 쌓는데 아무런 도움이 되지 못 합니다.  여유가 있을 실 때 (http://ryulib.tistory.com/94)를 한 번 읽어 주세요 ^^*



라이브러리 정리

예제를 작성하면서 만들었던 클래스들 중에는 다른 게임 등에서 재사용 할만한 것들이 좀 있습니다.  이것들은 공용 라이브러리에 옮겨서, 다음부터는 공용 라이브러리에서 참조하여 사용하겠습니다.

공용 라이브러리에 추가 될 클래스는 다음과 같습니다.
  • JoyStickInterface --> ryulib.game 패키지로 이동
  • Scroll --> ryulib.game 패키지로 이동
  • BackgroundImage --> ryulib.game 패키지로 이동
  • BitmapList --> ryulib.graphic 패키지로 이동
  • AnimationCounter --> ryulib.graphic 패키지로 이동

여기까지 마무리를 마치겠습니다.  모두들 수고하셨습니다 ^^*

관련글 더보기