본문 바로가기

3D/irrlicht

Irrlicht를 이용한 3D 슈팅게임 (Flight In Space)

 1. 개발 환경

- CPU : Intel Core 2 Duo E6300 1.8GHz - RAM : 2GB

- 그래픽 카드 : Geforce 7600GT

- 운영체제 : Windows 7 Ultimate

- 개발 툴 : Visual Studio 2010

 

2. 사용 엔진 및 라이브러리

- 3D 랜더링 : Irrlicht 1.71

- 소리 재생 : Irrkalng 1.3

 

3. 제작 기간 : 2010년 8월 10 ~ 2010년 8월 25일

 

4. 장르 : 3D 슈팅 게임

 

5. 조작키

- 화살표 방향키 : 유저 비행기 기체 이동

- A 키 : 미사일 발사

- S 키 : 폭탄 발사

- F9 키 : 체력 회복

- F8 키 : 초기 폭탄보유개수 재 탑재

 

6. 구조

▷ 기본 구조


▷ 사용 디자인 패턴

 FSM : 유한상태기계(FSM)는 주어지는 시간 내에 처할 수 있는 유한개의 상황을 가지고 주어지는 입력에 따라 다른 상태로 전환하거나 출력해서 액션을 취하는 장치를 말합니다. 게임 월드 상에서 오브젝트들은 각 객체마다 행동을 수행하기 때문에 이 행동에 따른 상태로 오브젝트들을 제어하기가 수월하다고 생각해서 FSM을 사용을 했습니다. FSM의 멤버 함수로는 멤버 변수에 접근할 수 있는 함수들을 제외하고 아래와 같은 함수들이 있습니다.

- getPosition() : 자신의 현재 위치 정보를 가져온다.

- IsDie() : 오브젝트가 죽은 상태인지 아닌지..

- Update() : 게임 오브젝트들의 동작 정보 갱신

- Signal() : 오브젝트간의 통신을 Signal 함수를 통해서 하는데, 여기서 메시지 전달 처리 방법을 사용했습니다. 직접 함수를 호출 하는 방법도 있겠지만, 이 방법은 모듈의 응집도를 높일 수는 있으나 변수 이름을 바꿨을 때 컴파일 에러가 날 가능성이 있습니다. 이런 메시지 전달 방법을 통해서 독립적 모듈을 생성가능하고, 재활용이 가능하며 프로그래머가 직관적으로 알아보기 쉬운 장점을 가지고 있습니다.

 

 팩토리 함수 패턴 : 팩토리 패턴은 객체들의 동적 메모리 할당을 책임지고 관리하는 팩토리를 만들어서 확장 및 관리를 용이하게 할 수 있게 하는 패턴입니다. (모든 오브젝트(플레이어, 적, 미사일, 아이템)에 위와 같은 팩토리 함수 패턴을 적용했습니다.)

 

 Singleton 패턴 : 클래스를 만드는 이유는 복수의 인스턴스를 효과적으로 다루기 위함인데, 전역변수의 사용은 변수의 이름이 충돌되는 경우 소스가 난잡해지는 경우가 있습니다. 그래서 클래스로 네임스페이스를 구분해서 관리해주면 전역변수의 장점과 클래스의 장점을 얻을 수 있으므로 이 패턴을 사용했습니다.

 

▷ 자원관리

 일리히트 엔진에서는 Scenenode 들이나 Mesh같은 경우에는 일리히트에서 사용하는 Drop함수를 사용했고, 오브젝트들을 관리하기 위해서 FSM을 상속받은 오브젝트들을 STL의 LIST 컨테이너에 넣고 순회하면서 유효성 테스트를 하고 유효하지 않은 객체들을 쉽게 자원해제 하기위해서 자원관리 객체인 shared_ptr를 사용했습니다. IFSMObject를 상속받은 플레이어, 적, 미사일과 아이템은 STL리스트 컨테이너에 넣어서 관리되고 STL 컨터이너에 담겨진 객체들의 자원은 shared_ptr이 관리합니다.

 

7. 게임에 대해서

- 유성우 파티클 : 원래는 종/횡 스크롤 비행 슈팅 게임을 만들려고 했으나, 다른 방식으로 만들어 보고 싶어서 우주공간에 있는 느낌이 나도록 만들었습니다. 그것을 위해 파티클의 값을 조정해서 유성우 효과를 냈습니다.

- 폭탄 : 폭탄의 구현은 간단하게 큐브 신노드에 텍스쳐를 입혀 구현을 했습니다. 처음에 그냥 단일 큐브 신노드는 분위기가 나오지 않았습니다. 그래서 3~4개 정도의 큐브 신노드를 약간의 간격을 줘서 겹치고 메테리얼타입의 색상을 TRANSPARENT 시켜 폭발의 느낌을 나오게 했습니다.

폭탄은 발사가 된 후, 폭발범위가 최대가 될 때, 그 범위 안에 있는 적기체가 터지도록 만들었고, 이를 위해 list를 탐색해 범위탐색으로 해당 적 기체 유무 검사를 했습니다.

- 경고 메시지 : 후방 적 기체가 등장했음을 알려주기 위해 빌보드를 이용하여 화면에 경고 메시지를 출력하도록 했습니다.

- Game Phase : 게임의 단계를 총 3분류로 나눴습니다. 게임 메뉴 - 플레이 - 게임 클리어 or 게임 오버 각 단계마다 시간의 흐름에 따라 플레이 되도록 만들었고, 단일 스테이지 구성으로 게임 클리어/오버 시에 처음인 게임 메뉴로 돌아오도록 설계를 했습니다.

- 점수 : 게임의 긴박감을 주기 위해서 시간이 흐르면서 기본점수를 획득하고 적 기체를 죽이면 더 많은 점수를 얻도록 만들었습니다.

- 미사일과 폭파 : 폭파는 경고 메시지와 마찬가지로 빌보드로 애니메이션을 줘서 만들었습니다. 미사일도 빌보드로 구현했습니다.

- 적 기체의 패턴 : 적 기체의 패턴 7가지와 보스로 구성했습니다.

- 코드 문서화 : 코드 문서화는 Doxygen이라는 문서화 도구를 이용했습니다.


9. 게임화면 

1) 메뉴 화면


2) 게임화면


3) 컨티뉴

 

4) 게임 클리어