[Don't Starve 모작]쥬신게임아카데미 게임프로그래밍학원 6개월차 SR 팀 시연회_130기 2조 작품_원혜연 서정원 최우진 조이_클라이언트
- 혜연 @WANTWON : 조장, 프레임워크, 카메라, 쉐이더, 환경 오브젝트, 파티클, 맵툴
- 조이 @Gioi Giuseppe : 몬스터, QUEST_NPC, 보스몬스터, 설치 오브젝트
- 정원 @JUNGWEONSEO : UI
- 우진 @gosomdochimon : 플레이어, PARTY_AI
스테이지는 크게 메인필드, 거미 던전, 미로 던전, 보스룸으로 구성되어있습니다.
- 게임 플레이를 위한 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 등등)은 엔진 프로젝트에 컴포넌트 패턴으로 구현하여 각 객체마다 필요한 컴포넌트들을 할당하게 처리했습니다.
- 레벨 전환 시 로딩씬에서 쓰레드를 이용하여 각 레벨에 필요한 프로토타입을 생성하고, 필요없는 프로토타입은 삭제되게 처리했습니다.

- 엔진에서 추상 클래스인 카메라를 생성하고, 클라이언트에서 상속 클래스로 Dynamic 카메라, FPS 카메라, Target 카메라 총 3개의 카메라를 구현했습니다.
- 이는 싱글톤으로 구현한 Camera Manager 를 통해 실행할 카메라를 선택할 수 있습니다.
- Dynamic 카메라는 플레이어 기준 카메라로, 마우스 휠로 ZoomIn/ZoomOut 할 수 있습니다.
- Q와 E키를 통해 카메라를 90도 회전할 수 있으며, 방향키 조절을 통해 카메라 높낮이 각도를 조절할 수 있습니다.
- FPS 카메라는 1인칭 시점으로 Q와 E를 통해 플레이어의 Look Vector 를 회전할 수 있게 했습니다. 동시에 카메라의 Look Vector 도 플레이어의 Look Vector를 따라가게 설정했습니다.



- Target Camera는 스토리 진행을 위해 작동되는 카메라입니다.
- 특정 보스 몬스터를 보여주는 씬이나, 특정 좌표를 바라봐야할 때, 혹은 NPC와 대화를 할 때 해당 카메라를사용합니다.
- 보스 몬스터의 경우 전투 시 카메라 쉐이킹을 함께 적용해주었습니다.


- 옵저버 패턴을이용해서 시간의 흐름을 기록하고, DAY,DINNER,NIGHT로 시간의 흐름이 바뀔 때마다 전체 객체들의 쉐이더 처리를 공통적으로 바꿀 수 있도록 처리했습니다. 시간의 흐름이 바뀔 때마다 플레이어의 스탯 변화, 몬스터들의 등장 변화 등 또한 옵저버 패턴을 이용했습니다.
- 밤이 될 경우 플레이어의 좌표를 기준으로 Min과 Max 범위를 설정해 Fog 효과를 주어 횃불효과를 주었습니다.
- 시간의 흐름 이외에도 플레이어의 상태에 따른 쉐이더 처리를 구현했습니다. 배고픔, 정신력, 체력중 하나라도 0이되어 사망할 경우 쉐이더로 rgb 값을 조절하여 흑백으로 효과를 주었습니다. 부활하면 다시 원래 색으로 돌아오게 처리했습니다.
- 그 외에도 아이템 설치 시 마우스 피킹으로 터레인 좌표를 구해 아이템을 설치하는 기능을 구현했고, 쉐이더로 알파블렌딩 처리하여, 설치할 공간을 미리 확인할 수 있도록 했습니다.
9개의 방으로 맵을 형성하고 각 방에 입장 할 때마다 문을 잠궈 해당 방 안에 있는 미니 컨텐츠를 진행하게했습니다.
컨텐츠를 통과해야만 다음 방으로 넘어갈수 있는 구조로 설치했습니다.
- 특정 좌표 범위에 도달하면 시점이 FPS 카메라로 전환되어 1인칭 시점으로 바뀝니다. 해당 공간에서 함정에 걸리지 않고 탈출 해야합니다.
- 미로 중간중간에 맵툴로 함정을 설치하여 플레이어의 이동경로를 제어하고 혼돈을 주도록 했습니다.
- 슈팅 게임을 시작하면 Target Camera로 카메라 뷰가 바뀌며 게임이 시작됩니다.
- y축 회전 행렬을 이용하여 화살을 슈터 기준으로 공전시켜, 버튼을 누르면 화살이 발사되게 처리했습니다.
- 타겟은 새와 파리로 랜덤으로 변동되며, 5개 타겟 모두 새로 명중시킬 시 게임이 종료되게 처리했습니다.
- 디펜스할 석상과, 몬스터 스포너를 설치하여 디펜스 게임을 진행했습니다.스포너는 총 5번 몬스터를 소환할 수 있고, 플레이어가 일정 거리에 가까워지면 생성합니다.
- 몬스터는 석상을 공격하려하고, 플레이어는 스포너의 모든 몬스터가 죽을 때까지 석상을 지키면서 몬스터를 해치워야합니다.
- 게임 시작시 계란들이 지정된 좌표로 등장하며 플레이어로부터 도망칩니다.
- 플레이어는 이를 고려하여 알의 반대 방향으로 움직여 이동 경로를 제어해 둥지로 유인해야합니다.
- 알은 15초마다 재생성되며, 모든 알들이 둥지로 돌아갔을 경우 문이 열리며 게임이 종료됩니다.
전반적인 환경 오브젝트들을 설치하고 디테일을 구현했습니다.



- MFC로 맵툴을 만들어 터레인을 설치하고, 높이를 조절하는 기능을 구현했습니다.
- 추가적으로 object를 설치하여 해당 object의 종류와 위치 등을 저장하여 클라이언트에 연동했습니다.
자세한 코드 설명은 깃허브 프로젝트 혹은 기술소개서에서 확인 가능합니다.
- 옵저버 패턴, 프로토타입 패턴, 컴포넌트 패턴
- AABB, OBB 큐브 충돌
- 파티클 시스템
- 카메라 변환
- 절두체 컬링
- MFC 맵툴