게임의 전체적인 프로젝트 구조는 아래의 깃 링크를 통해 확인하실 수 있으며,
아래의 내용은 구조와 관련하여 간략하게 설명한 글입니다.
오브젝트의 기본적인 구조
먼저 오브젝트의 연산과 프레임마다 오브젝트의 위치값을 계산하여 반환하는 역할만 하는 클래스를 옆의 마인드맵처럼 배치를 했습니다.
오브젝트 인터페이스는 말 그대로 인터페이스의 역할을 하며 2D와 3D로 오브젝트 z축의 유무를 가립니다. 3D에서 높이 값을 따로 설정해야 하는지 아닌지로 또 나뉩니다.
이와 같이 클래스들을 배치하면 2D에는 주로 UI를 담당하는 오브젝트를 처리하고, 높이 값이 존재하는 클래스는 주로 롱 오브젝트나 화면 뒤 트랙을 담당합니다.
높이 값이 존재하지 않는 클래스는 숏 객체나 내려오는 판정선 등 텍스처의 높이에 맞춰 렌더링을 하는 오브젝트의 연산을 담당하였습니다.
이러한 클래스들은 오브젝트 인터페이스에 상속되어 게임 안에서 클래스를 받을 때 오브젝트 인터페이스 형식으로 반환되어 받습니다.
오브젝트 렌더링 관련
이번엔 오브젝트를 렌더링 하도록 옆의 그림처럼 진행하기 위해 버텍스 클래스를 만들었습니다.
이전에도 옆의 그림처럼 렌더링을 해왔지만 클래스의 구분 없이 무작정 렌더링을 했습니다.
그래서 이번 리펙토링에서 렌더링하는 버텍스들을 하나로 묶어 관리할 수 있도록 클래스 화 하였습니다.
옆의 사진은 버텍스의 기능들을 묶어 한번에 관리가 가능하도록 만든 클래스입니다.
원래 텍스처도 이 클래스 안에 넣으려 했으나 이 클래스는 버텍스만 관리하도록 설계를 하였기 때문에 텍스처는 넣지 않았습니다.
이 클래스를 기준으로 2D 스프라이트를 출력하는 클래스와 애니메이션이 포함된 클래스를 만들어 확장하였습니다.
오브젝트(인 게임에 사용하는 오브젝트) 업데이트 관련
이번엔 오브젝트 인터페이스의 클래스를 받아 게임 안에서 실시간으로 계산하거나 터치 이벤트를 받아 처리하는 클래스입니다.
인 게임 오브젝트라는 인터페이스 클래스를 기준으로 게임 오브젝트라는 가상 클래스를 만듭니다.
이 가상 클래스는 아래의 숏 객체와 롱 오브젝트, 노브 오브젝트의 공통된 코드를 처리하였습니다.
그 외의 서로 다른 코드가 존재하는 함수는 각자의 클래스에서 받아 구현하게 하였습니다.
옆의 코드가 인 게임 오브젝트 인터페이스 클래스입니다.
렌더링 할 때 만 필요한 함수들만 선언하였습니다.
주석으로 각각 함수들의 역할을 적었습니다.
상속받은 오브젝트의 형태
이번엔 위에 언급했던 2개의 클래스를 하나로 묶어주는 클래스입니다.
게임 환경 안에 이 클래스가 최종적으로 들어갑니다.
길게 코드를 작성할 필요 없이 바로 간단한 함수만 불러오면 바로 사용이 가능합니다.
터치 관련 처리 방식
이 게임에서 가장 중요한 게임 버튼입니다.
버튼은 터치 가능한 오브젝트로 분류하여 클래스를 만들었습니다.
이 버튼 클래스에서는 일정 범위 안에 터치가 되었는지 안 되었는지, 그리고 터치가 되었으면 그 좌표는 어떻게 되는지, 프레임 사이의 좌표의 이동한 값이 얼마인지를 담고 있습니다.
버튼 클래스에 들어있는 값을 인 게임 오브젝트에 함수 인자로 전달되어 타이밍이 맞게 제대로 된 버튼을 눌렸는지 확인합니다.
옆의 그림이 게임이 돌아가며 렌더링 하는 모습을 간단하게 나타낸 그림입니다. GameWorld는 게임이 진행되는 모든걸 맡아 처리를 합니다.
GameWorld안엔 렌더링과 업데이트 클래스가 따로 있고, GameController라는 게임의 입력처리를 담당하는 클래스를 가지고 있습니다.
프레임 워크에 따른 전체적인 클래스의 형태
다음 사진들은 이 게임의 리펙토링을 위해 설계했던 다이어그램과 클래스 재설계를 마친 게임 프로젝트의 모습입니다.
위 사진의 설계 그림과는 약간 다르거나 새로운 클래스가 덧붙이긴 하였지만 전체적인 흐름은 위 설계그림과 동일합니다.