[DirectX9] Don't Starve 모작
📌 해당 설명서는 팀원 개개인이 개별적으로 작성하기에 팀원 모두의 구현 내용을 담은 것이 아닙니다.
추후 팀원들의 개별 작성을 통해 main branch 에는 팀원들의 전체 내용이,
각 팀원별 branch에는 개인이 담당한 파트 일부분이 기록될 예정입니다. 이 점 참고바랍니다.
동영상/GitHub
[Don't Starve 모작]쥬신게임아카데미 게임프로그래밍학원 6개월차 SR 팀 시연회_130기 2조 작품_원혜연 서정원 최우진 조이_클라이언트
담당파트
- 혜연 @WANTWON : 조장, 프레임워크, 카메라, 쉐이더, 환경 오브젝트, 파티클, 맵툴
- 조이 @Gioi Giuseppe : 몬스터, QUEST_NPC, 보스몬스터, 설치 오브젝트
- 정원 @JUNGWEONSEO : UI
- 우진 @gosomdochimon : 플레이어, PARTY_AI
게임 주요 사진
스테이지 구성
스테이지는 크게 메인필드, 거미 던전, 미로 던전, 보스룸으로 구성되어있습니다.
구현 컨텐츠 및 기능 설명
1. 프레임워크
- 게임 플레이를 위한 Client와 공통적인 기능들을 담은 Engine으로 두 개의 프로젝트를 생성했습니다. 클라이언트에서 여러 객체들이 사용할 수 있는 struct, function, 매크로 등을 모두 Engine프로젝트에서 생성했습니다.
- 그 밖에도 Engine 프로젝트에서 레퍼런스를 관리하기 위한 추상 클래스를 만들어 공통적인 기능들을 수행하게 했습니다. Engine 프로젝트 내부에서 Initialize - Tick - Late Tick - Render - Free등 공통 기능들을 구현하고, 클라이언트에서 추상 클래스의 함수를 오버라이드 하여 세부 기능들을 구현하게 처리했습니다.
- 이와 같은 엔진 프로젝트는 DLL(동적 라이브러리 파일)로 변환하여 클라이언트에서 기능을 사용할 수 있도록 처리했습니다.
- 엔진에 있는 CGameInstance를 싱글톤으로 처리하여 엔진 내부에서 Tick→LateTick→Render를 선언하였고, 그 안에서 다른 공통적인 기능들을 담당하는 Collision Manager, Level_Manager, Object_Manaer, Sound_Manager, Timer_Manager 등을 싱글톤으로 구현하여 각각의 매니저가 가지고 있는 오브젝트들을 업데이트할 수 있도록 처리했습니다.
- 객체들을 생성할 때 레퍼런스 관리를 위해 추상 클래스를 생성하고, 상속 클래스를 생성할 때 추상 클래스의 프로토타입을 클론하는 Prototype 패턴을 사용했습니다.
- 또한 공통적으로 필요한 기능들(예를 들어 VIBuffer, Transform, Collision 등등)은 엔진 프로젝트에 컴포넌트 패턴으로 구현하여 각 객체마다 필요한 컴포넌트들을 할당하게 처리했습니다.
- 레벨 전환 시 로딩씬에서 쓰레드를 이용하여 각 레벨에 필요한 프로토타입을 생성하고, 필요없는 프로토타입은 삭제되게 처리했습니다.
2. 카메라
- 엔진에서 추상 클래스인 카메라를 생성하고, 클라이언트에서 상속 클래스로 Dynamic 카메라, FPS 카메라, Target 카메라 총 3개의 카메라를 구현했습니다.
- 이는 싱글톤으로 구현한 Camera Manager 를 통해 실행할 카메라를 선택할 수 있습니다.
Dynamic Camera
- Dynamic 카메라는 플레이어 기준 카메라로, 마우스 휠로 ZoomIn/ZoomOut 할 수 있습니다.
- Q와 E키를 통해 카메라를 90도 회전할 수 있으며, 방향키 조절을 통해 카메라 높낮이 각도를 조절할 수 있습니다.
FPS 카메라
- FPS 카메라는 1인칭 시점으로 Q와 E를 통해 플레이어의 Look Vector 를 회전할 수 있게 했습니다. 동시에 카메라의 Look Vector 도 플레이어의 Look Vector를 따라가게 설정했습니다.
Target Camera
- Target Camera는 스토리 진행을 위해 작동되는 카메라입니다.
- 특정 보스 몬스터를 보여주는 씬이나, 특정 좌표를 바라봐야할 때, 혹은 NPC와 대화를 할 때 해당 카메라를사용합니다.
- 보스 몬스터의 경우 전투 시 카메라 쉐이킹을 함께 적용해주었습니다.
3. 쉐이더
- 옵저버 패턴을이용해서 시간의 흐름을 기록하고, DAY,DINNER,NIGHT로 시간의 흐름이 바뀔 때마다 전체 객체들의 쉐이더 처리를 공통적으로 바꿀 수 있도록 처리했습니다. 시간의 흐름이 바뀔 때마다 플레이어의 스탯 변화, 몬스터들의 등장 변화 등 또한 옵저버 패턴을 이용했습니다.
- 밤이 될 경우 플레이어의 좌표를 기준으로 Min과 Max 범위를 설정해 Fog 효과를 주어 횃불효과를 주었습니다.
- 시간의 흐름 이외에도 플레이어의 상태에 따른 쉐이더 처리를 구현했습니다. 배고픔, 정신력, 체력중 하나라도 0이되어 사망할 경우 쉐이더로 rgb 값을 조절하여 흑백으로 효과를 주었습니다. 부활하면 다시 원래 색으로 돌아오게 처리했습니다.
- 그 외에도 아이템 설치 시 마우스 피킹으로 터레인 좌표를 구해 아이템을 설치하는 기능을 구현했고, 쉐이더로 알파블렌딩 처리하여, 설치할 공간을 미리 확인할 수 있도록 했습니다.
4. 미로 던전 컨텐츠
9개의 방으로 맵을 형성하고 각 방에 입장 할 때마다 문을 잠궈 해당 방 안에 있는 미니 컨텐츠를 진행하게했습니다.
컨텐츠를 통과해야만 다음 방으로 넘어갈수 있는 구조로 설치했습니다.
미로 탈출
- 특정 좌표 범위에 도달하면 시점이 FPS 카메라로 전환되어 1인칭 시점으로 바뀝니다. 해당 공간에서 함정에 걸리지 않고 탈출 해야합니다.
- 미로 중간중간에 맵툴로 함정을 설치하여 플레이어의 이동경로를 제어하고 혼돈을 주도록 했습니다.
슈팅 게임
- 슈팅 게임을 시작하면 Target Camera로 카메라 뷰가 바뀌며 게임이 시작됩니다.
- y축 회전 행렬을 이용하여 화살을 슈터 기준으로 공전시켜, 버튼을 누르면 화살이 발사되게 처리했습니다.
- 타겟은 새와 파리로 랜덤으로 변동되며, 5개 타겟 모두 새로 명중시킬 시 게임이 종료되게 처리했습니다.
거미 디펜스
- 디펜스할 석상과, 몬스터 스포너를 설치하여 디펜스 게임을 진행했습니다.스포너는 총 5번 몬스터를 소환할 수 있고, 플레이어가 일정 거리에 가까워지면 생성합니다.
- 몬스터는 석상을 공격하려하고, 플레이어는 스포너의 모든 몬스터가 죽을 때까지 석상을 지키면서 몬스터를 해치워야합니다.
둥지로 알보내기
- 게임 시작시 계란들이 지정된 좌표로 등장하며 플레이어로부터 도망칩니다.
- 플레이어는 이를 고려하여 알의 반대 방향으로 움직여 이동 경로를 제어해 둥지로 유인해야합니다.
- 알은 15초마다 재생성되며, 모든 알들이 둥지로 돌아갔을 경우 문이 열리며 게임이 종료됩니다.
5. 환경 오브젝트/파티클
전반적인 환경 오브젝트들을 설치하고 디테일을 구현했습니다.
6. MFC 맵툴
- MFC로 맵툴을 만들어 터레인을 설치하고, 높이를 조절하는 기능을 구현했습니다.
- 추가적으로 object를 설치하여 해당 object의 종류와 위치 등을 저장하여 클라이언트에 연동했습니다.
기술적 요소
자세한 코드 설명은 깃허브 프로젝트 혹은 기술소개서에서 확인 가능합니다.
- 옵저버 패턴, 프로토타입 패턴, 컴포넌트 패턴
- AABB, OBB 큐브 충돌
- 파티클 시스템
- 카메라 변환
- 절두체 컬링
- MFC 맵툴