동영상 링크 : https://youtu.be/qPkgAsugrzk

 

[구현]

 

오브젝트

플레이어 : 기본적인 이동과 엎드리기 밑 아래점프 구현

몬스터 : Monster 부모 클래스를 상속받아 몬스터 별 세부적인 설정을 할 수 있도록 함

NPC : Button 클래스를 이용하여 Click시에 해당 NPC의 이벤트 발생

펫 : 플레이어를 따라다니도록 하며 주변의 아이템과 충돌검사로 아이템 습득

이동 : 사각형과 직선의 충돌검사를 통한 선타기 적용

포탈 : 충돌검사 후 윗방향키를 누를경우 씬전환

히든포탈 : 근처에 갈경우 활성화 되며 포탈과 동일한 로직 적용

 

스킬

스트라이크애로우 : AABB충돌을 통해 범위 판정

페이탈블리츠 : 스킬에 DeltaTime 인자를 주어서 일정주기로 공격

제네시스 : 큰 범위 공격을 하며 주변 지형을 파악해 추가적인 이펙트를 소환

벽력일섬 :  TimeManager를 통해 게임의 시간을 느리게 흘러가도록 구현

콤보데스폴트 : CameraManager를 통해 게임화면을 움직이게 하는 효과를 구현

 

이펙트

오브젝트 풀링을 이용하여 데미지 이펙트와 같이 재사용성이

높은 오브젝트를 재생성하지 않도록 구현

 

퀵슬롯

플레이어가 퀵슬롯의 수 크기의 int배열을 갖고 있고 특정한 값을 부여하여

특정 키를 눌렀을 때 해당키에 맞는 값을 이용해 아이템, 스킬 사용

 

인벤토리

struct를 이용하여 장비, 소비, 기타 를 각각 나누고 배열 형태로 Player클래스가 소유 하도록 함

장착/해제 (클릭 & 클릭) : MouseManager를 통해 클릭할 경우 해당장비 위치 값을 전달

장착/해제 (더블클릭) : MouseManager를 통해 더블클릭을 판별하고 해당장비 위치 값 전달

이동 : 기본적인 Swap을 통해 해당 위치를 교환

버리기 : 장비가 선택된 상태에서 UI를 제외한 화면을 클릭할 경우 버려지도록 구현

 

아이템

툴팁 : 상단, 중단부, 하단부를 나눠서 합치는 방식으로 구현

스타포스 : 장비를 스타포스레벨에 따른 확률로 강화 할 수 있도록 구현

 

스테이터스

스탯 : 실시간으로 스탯을 찍을 시 적용되도록 구현

자동배분 : 현재남아 있는 스탯을 모두 자기 직업에 맞는 스탯으로 전환

 

옵션

배경음, 효과음 : SoundManager를 통해 전반적인 값 통제

스킨, 스킨효과 : 현재 플레이하는 Player에게 데미지스킨과 효과를 설정할 수 있도록 인자 값 전달

 

사망

사망시에 사망 UI가 나오게 되며 확인버튼을 클릭시

나오가 나타나게 되며 일정시간 뒤에 플레이어를 회복시켜줌(스킬로 구현)

 

인터페이스

포커싱 : MouseManager를 통해 현재 최상단에 위치한 UI를 파악하여 클릭시에 가장 앞으로 올수 있도록 구현

드래그 : UI의 윗부분에 보이지 않는 네모박스를 통해 드래그 할 수 있도록 구현

 

퀘스트

플레이어가 list의 형태로 퀘스트 클래스를 소유하고 있으며

특정 행동시 플레이어가 list를 순회하며 값을 변동 시키도록 함

 

상점

구매 목록 : NPC는 list를 통해 특정 값을 갖고 있으며 ItemManager를 통해 해당 아이템 나열

판매 목록 : Player의 Itemlist를 순회하여 아이템 나열

스크롤 : 드래그 상태를 체크하고 현재 마우스위치에 맞는 위치로 이동후 아이템 나열

 

보스

낙하물 : 일정 주기로 소환

찌르기 : 플레이어가 근처에 있을경우 시전

돌진 : 플레이어와 멀어질 경우 돌진을 시전

검기발사 : 랜덤한 확률로 검기 발사를 시전

HP게이지 : 선형보간을 통해 이전 HP와 현재 HP를 비교하여 나타냄

 

카메라

기본적인 Culling을 통해 해당 카메라 범위 밖에 있는 오브젝트는 출력하지 못하도록 함

Alpha 값이 필요한 오브젝트의 경우 Alpha 값이 존재할 경우 GdiPlus를 사용하고 

그렇지 않을 경우에는 Gdi를 이용하여 출력하도록 함

 

 

[아쉬운 점]

GdiPlus의 경우 연산이 무거워 자유롭게 사용 할 수 없었다.

Plgblt를 통해 회전을 사용하고 OBB를 이용하여 충돌처리를 해보고 싶었는데 하지 못하였다.

현재는 충돌보다는 Render의 부담이 더 크기 때문에 충돌에 부담을 느끼지 못하여

O(n^2)의 일반적인 방법을 사용하였는데 추후에 SAP 혹은 BSP를 이용하여 충돌처리를 해보고 싶다.

싱글 플레이라는 가정하에 싱글톤을 남발하여 구현을 한 경향이 있는데

만약 서버의 입장에서는 데이터를 어떻게 처리해야 할지 정답을 찾지 못해 아쉬움이 남는다.

 

 

[느낀 점]

한달 전 Winapi를 처음 접했을 시점에는 새로운 프레임워크에 당황하였고

유니티에서 쉽게 사용하던 것들을 사용하지 못하여 어려움이 있었으며

해당 기능들을 직접 구현하며 많은 것을 배울 수 있던 시간이었다.

 

+ Recent posts