GameTool : 3DMax에서 만든 FBX파일을 Mesh파일로 변환하고, 변환한 Object들을 큰 맵에 배치함에 효율을 높이기 위해 DirectX를 이용해서 프로젝트 기간 초기에는 툴 제작에 비중을 높였다.
로그인 : 로그인 버튼은 IME UI를 이용하여 만들었고, 이미지 처리는 모두 Sprite를 이용하였다. ID와 Password는 IME UI를 쓰지 않고 직접 BoundingBox( 충돌체크 박스 )처리하여 클릭 시 입력 할 수 있게 만들었고, 문자는 모두 string형식으로 받아와 서버로 넘겨주도록 했다. 클라이언트에서 입력받은 ID와 Password를 서버에서 확인하고, 서버에 미리 저장되어있는 ID와 Password와 비교 후 로그인 처리를 하도록 구현 하였다.
로비 : 이미지 처리는 로그인과 마찬가지로 레디 버튼과 채팅 창은 IME UI로 구현 하였고, 나머지는 Sprite를 이용하였다. 캐릭터 선택은 BoundingBox처리하였고, 적 인원수와 로비 대기시간 출력, 캐릭터 위에 나타나는 각각의 ID는 Font로 나타냈다.
충돌체크:캐릭터와 캐릭터 끼리는Sphere VS Sphere(구와 구)충돌체크를 하였고,미끄러짐 벡터를 적용시켜 서로 부딫히면 미끄러지게 구현하였다.캐릭터와 건물 끼리는Sphere VS BoundingBox (구와 충돌박스)충돌체크를 하였다.맵 안의 건물BoundingBox는Tool에서 좌표값을 입력하여 직접 씌웠다.캐릭터의 위치가 배경 오브젝트에 겹쳐지는 상황이 발생해서는 안되므로OBB(Oriented Object Box :물체를 감싸는 방향성 있는 박스를 사용)로 배경 메시에 박스를 씌운 다음 그OBB좌표에 맞춰서 평면을 만들어서OBB상자에 붙여 점과 평면 사이의 충돌판정으로 기본적인 충돌을 처리 하였다.
인공지능:몬스터가 위치한 곳에 큰Sphere를 씌워 캐릭터가 그Sphere안으로 들어오면 몬스터는 제일 먼저 들어온 캐릭터의 좌표를 따라가도록 구현하였다.
스킬 : 각각 캐릭터 타입마다 세 개씩 스킬 함수를 만들었으며, 스킬 1,2,3키를 누르면 해당 스킬 함수를 호출하게 된다. 모든 스킬은 Player클래스에서 플레이어 캐릭터 타입에 따라 항상 스킬 사용을 체크하는 함수를 구현하여 각 스킬의 지속시간과 사용시간을 확인하도록 하였다. 또한 각 스킬에 해당하는 충돌 처리 부분은 충돌 처리하는 클래스인 GameCollision를구현하여이클래스에서처리한다.
버프 : 보스 몬스터를 죽였을 시에 거점지가 해당 팀의 점령지가 되며 팀 내의 거점지 점령 수에 따라서 버프가 최대 3개가 생성된다. 거점지의 수에 따라 Player 클래스 에서 버프를 체크하여 버프 이펙트와 능력치가 적용되도록 하였다.
사운드 :FMOD라이브러리를 사용해서SoundMgr(사운드 관리 클래스)를 만들어 사운드를 구현하였다.플레이어가 위치한 곳에서 멀어질수록 소리가 작아지도록 구현하였다.미리 사운드파일 목록을 작성하여 초기화 과정에서 사운드를 저장시킨 다음 사운드가 필요할 때마다 사운드 매니저의Play()함수를 호출하여 해당 사운드의enum값을 입력해 사운드를 출력하는 방식이다.전체 배경음악 같은 경우엔 계속 반복재생이 이루어져야 하기 때문에FMOD_LOOP_NORMAL옵션을 설정하였다.
이펙트:이펙트Mesh를 가져와서DirectX디바이스에SetRenderState의그리기옵션을설정하여해당위치에 적용하여 나타내었으며,이미지를 이용하여 만든 이펙트는 빌보드를 사용하여 항상 유저의 화면에 정면에서 보이도록 구현하였다.
셰이더,그림자: 3D게임프로그래밍, Directx9를 이용한3D GAME프로그래밍 입문,셰이더 프로그래밍 입문,책들을 참조하여 캐릭터의 라이팅과 실시간 그림자를 그림자는 케릭터와 건물등 오브젝트를 그리기전에 그림자가 그려질 오브젝트들을 텍스쳐에 그린후 모두 같이 그려지도록 구현 하였다.
Server : 클라이언트에서 보낸 패킷을 받아서 서버에서는 모든 유저에게 패킷을 보내고 서버에서는 채팅 및 공격판정등을 구현
Client : 게임화면을 State패턴을 사용하여 Scene이 변경될 때 변경되는 Scene으로 교체를 해주고 Command를 사용하였는데 이것은 서버에서 보내는 패킷을 처리하는 별도의 쓰레드를 사용하며 별도의 쓰레드에서 메인쓰레드로 정보전달하여 사용.
캐릭터에 필요한 데이터는 캐릭터쪽에 넣고, 제단에 필요한 데이터는 제단쪽에 넣어서 사용.
Tool : Tool에서는 MAX에서 변환한 FBX를 mesh로 전환 및 OBB, AABB박스를 씌울수 있으며 캐릭터의 경우 mesh파일로 전환한 뒤 char파일로 변환하여 char파일에서 무기와 캐릭터의 OBB, ABB를 처리하였고 Map의 경우에는 mesh파일로 전환한 뒤에 각 Map에 들어갈 object를 추가하여 배치를 다하면 .map파일로 저장하여 사용.
1) 서버구현
서버의 시작 및 종료 상태를 표시하며 Client의 채팅을 받고 각 Client에 보내는 역할을 하며게임에 필요한 패킷을 주고 받으며 게임을 실행시키는 역할을 한다.
UID : 서버에 접속한 클라이언트에 번호를 부여하고 보여주는 역할
ID : 각 클라이언의 입력한 ID.
IP : 접속한 클라이언의 IP를 표시.
HOST : 접속한 Client가 HOST인지 체크하여 상태를 표시하며 게임룸에서 HOST가 게임 시작할수 있는 역할을 함.
READY: HOST 다음으로 접속한 Client이며 게임 실행이 가능한지 상태를 표시.
2) 콤보, 리스폰 UI 및 리스폰, 무적, 제단 이펙트
콤보는 플레이어가 일정시간에 상대 플레이어를 피격시킬 경우 이어가는 것으로 코드를 작성하였으며 플레이어가 사망시 리스폰게이지가 나오면서 10초가 경과 뒤에 시작한 위치에서 리스폰이 되며 이때 나오는 이펙트가 있으며 PVP게임 특성상 바로 싸움이 일어나서 다시 죽는 것을 방지하여 무적이펙트를 넣어서 3초 동안의 무적을 주는 것으로 함.
3) 스킬
치우의 스킬 같은 경우 Sphere을 사용하여 범위내에 있으면 타격판정이 들어가며 포세이돈의 경우에는 스킬이펙트에 OBB를 사용, 에로스의 경우 바닥부분에 Sphere사용, 호루스의 경우 이펙트에 OBB, 발키리의 경우에는 무기의 OBB로 충돌체크를 하였으며 오공의 경우 Sphere를 사용하였음.
4) GameTool
Tool에서는 Max 작업한 뒤 Fbx로 변환한 파일을 불러온 뒤 mesh파일로 변환하고 캐릭터의 경우 fbx파일을 불러와서 애니메이션이 있는 fbx를 추가하여 mesh파일로 변환하거나 아니면 모두 mesh파일로 변환한 뒤에 애니메이션을 추가를 하고 이 캐릭터 파일을 char파일로 추가한 뒤에 캐릭터의 몸 OBB와 무기에 OBB영역을 구하고 저장을 하면 이 char파일을 이용해서 게임에서 CollisionCheck를 해준다.
Field작업 또한 기본적인 것은 같으나 mesh로 변환한 파일을 하나씩 불러와서 오브젝트 추가를 한 뒤 위치에 맞게 좌표를 입력하여 이동을 시키고 scale을 변형시키게 되면 따로 충돌오브젝트를 추가하여 박스를 크기에 맞게 씌워준다 그리고 또한 오브젝트들의 Rate를 변형 시킬수 있어서 맵디자이너가 위치하고 싶은 곳에 위치를 해놓았다가 오브젝트의 각도를 조정하여 맵에 매치를 시키게 했으며 맵 배치가 끝나면 파일명을 .map로 하였음.