던전 씬 구조 변경
- 던전 씬은 여러 개의 스테이지를 가지고 있고, 각각의 스테이지는 또 여러개의 던전을 가지고 있다.(던전과 던전씬 혼동x)
- 스테이지는 던전-던전-던전-보스방와 같은 구조를 통틀어서 관리하는 객체이고, 던전은 각각 타일/배경/이벤트를 소유한 독립적인 개체이다.
- 스테이지가 존재하는 이유는 각각의 던전을 연결하기 위함이며 현재 던전이 완료되었다는 메시지를 수신하면 다음 던전으로 이동시키는 등의 로직을 구성할 생각이다.
- 던전은 맵 파일의 주소(Path)를 생성자에서 전달 받게 되고, 주소를 가지고 있다가 Enter에서 타일 객체와 배경 객체들을 씬에 추가한다.
- 이 구조는 초안이므로 언제든지 변경될 수 있음
배경 오브젝트를 추가하는 툴 제작
- 앞서 작업했던 원근 투영을 최대한 활용하기 위해 툴을 제작해야 했는데, 여러 장의 배경 이미지를 두고, 이 배경들의 깊이 차이에 따라 어떻게 움직이는지 하나 하나 디버깅해도 되지만 만들어야 하는 맵이 많아질수록 이 방식은 무리가 있다고 생각이 들었다.
- 따라서 이번에 만든 툴은 정확히는 배경 오브젝트를 생성하고 툴 단에서 배경 오브젝트의 위치나 스케일을 조절할 수 있는 툴이다.
- 기존에 타일 툴과 별개로 만들까 생각을 했는데, 결국 배경이나 타일은 하나의 결과물로 합쳐져서 저장되게끔 할 생각이므로, 하나의 GUI안에 탭을 따로 두고 거기에 구현을 하는 게 맞다고 생각했다.
- 모든 작업이 끝난 후 Option 탭에서 Save하면 내가 만든 작업물들이 하나의 파일로 만들어져서 저장되도록 할 것이다.
- 앞으로 툴로써 작업해야 할 큰 덩어리는 던전이 이벤트 큐를 소유하게 하고, 각각의 이벤트는 조건을 가지고 있어서, 조건을 만족하면 해당 이벤트가 호출되고, 큐에서 제거된 후 큐에 저장된 다음 이벤트가 다시 조건을 만족하길 기다리는 것이다.
- 이렇게 하면 몬스터가 던전 내에서 다 죽거나, 플레이어가 특정 위치로 이동했을 때 몬스터를 소환하는 등의 처리를 효율적으로 해줄 수 있다.
내일 할 일
- 맵 파일에 배경을 실제로 포함 (현재는 그렇게 할 수 있는 도구까지만 개발됨)
- 상점 맵 제작
<구상노트>
- 씬 관련 이벤트들은 복잡하기 때문에 처음에 가닥을 잡고 그 범위 안에서 확장하거나 축소하는 식으로 로직을 구성하는 게 나중에 그 위에 쌓아올릴 때 손이 덜가고 편하다.
- 통상 큰 덩어리들을 작업할 때는 아래와 같이 구상 노트를 작성하고 거기에 맞춰 코드를 작성한다.
씬 이벤트 처리
특정 조건이 만족했을 때 씬 이벤트를 실행하려면?
씬에서 처음부터 이벤트들을 가지고 있어야 함
큐에 이벤트를 순서대로 들고 있고, 최근 이벤트 발동하는 조건을 만족하는지 체크한다
조건 : 몬스터 모두 처치 or 플레이어 oo 위치로 이동
스테이지에 입장하면 스테이지가 가진 이벤트들을 씬 이벤트 큐에 추가한다?
현재 큐가 비었다면 맵 클리어
이렇게 하면 다른 씬 이벤트를 실행시킬 수 없다
ex) 페이드인/아웃 등
페이드 인 아웃은? 맵 시작에서 처리하므로 문제되지 않는다
그런데 어떤 몬스터를 어떤 위치에 소환한다 라는 구체적인 명령은 어떻게 처리해야 하는가?
'몬스터의 정보, 위치를 씬에 추가한다'를 이벤트로 전달해야 한다
스테이지에서 이벤트를 가지고 있다가 처리한다?
던전씬 -> 여러개의 스테이지를 다룬다 (스테이지 벡터) -> 실제론 array로 구성
스테이지는 여러 개의 Map을 갖는다 맵은 타일과 몬스터를 갖는다
이 방식의 단점 -> 아이템을 추가하거나 상자를 추가하는 등의 작업을 수행하기가 껄끄럽다
그리고 몬스터를 이후 추가하는 게 쉽지 않다
해결방법 -> 몬스터를 추가하거나 상자를 추가하는 것을 이벤트로 처리한다
이벤트 수신은 큐로 처리한다
'던전' 이라는 용어로 통일
ImGui로 해당 이벤트를 선택한 후 저장할 수 있게 해야 한다
이벤트를 선택하면 이벤트의 상세 스펙을 또 선택할 수 있다.
예를 들어 몬스터 소환이라면 몬스터 종류와 위치
몬스터 정보를 파일로 저장한 후 그걸 가져온다?
-> 코드상으로 확인할 수 없어서 개발단계에서 추가하기에는 부적절하다
일단 enum값으로 처리하고 나중에 여력이 되면 개선
조건을 설정하는 방법?
이벤트는 조건을 가져야 한다
조건은 미리 만들어진 조건 블럭들을 활용한다
IfMonsterAllDead와 같은 조건 블럭들을 만들고, 이 블럭을 선택하면 몬스터가 다 죽은 후 해당 이벤트가 발동한다
이 조건 블럭이 발동되어서 이벤트가 실행되고 나면, 해당 이벤트는 큐에서 삭제되고, 다음 이벤트가 대기한다
두 가지 조건이 묶여야 할 수 있다 (이 또한 두 조건구문을 And로 묶을 수 있도록 처리하면 되지만 코드가 지저분해질 경우 두 개를 묶은 클래스를 만들어서 처리)
"되도록이면 두 개의 조건까지 처리할 수 있도록 로직 구성"
타일맵 툴을 수정해야 하나?
타일맵 툴에 메뉴를 하나 추가해서 다른 맵을 구성하는 요소들도 맵에 추가할 수 있게 한다
ex) 상점으로 통하는 문 등
몬스터를 직접 추가하지 않는다
모두 이벤트로 처리한다
"플레이어가 입장한 경우" 조건 블럭을 통해 몬스터 소환 이벤트를 실행시킨다
"몬스터가 다 죽은 경우" 조건 블럭을 통해 또 다시 몬스터 소환 이벤트를 처리한다
"몬스터가 다 죽은 경우" && "플레이어가 특정 위치를 트리거한 경우" 조건 블럭을 통해 몬스터 소환 이벤트를 처리한다
"몬스터가 다 죽은 경우" 조건 블럭을 통해 상자를 소환한다
"상자를 통해 나온 아이템들이 사라졌다면(플레이어와 상호작용했다면)" 조건 블럭을 통해 Local에 존재하는 오브젝트들의 Activate 콜백을 실행시킨다
몬스터 소환도 이벤트로 처리하기 때문에 해당 프레임에 처리되지 않는데, 몬스터 소환 이벤트가 등록된 상태에서 몬스터가 없다고 인지하고 이후 이벤트가 연속으로 실행되면?
-> 이벤트 실행은 이벤트가 등록되었다면 다음 프레임은 건너뛴다
-> 건너뛰는 방법은? 이벤트가 등록될 때 스테이지(던전)에 플래그를 주게 되고, 이벤트가 실행될 때 플래그를 해제한다
-> 이 플래그가 설정되어있는 동안은 조건검사를 하지 않아야 한다
상점을 별도의 씬으로 처리해야 하는가?
상점을 씬으로 처리함으로써 생기는 이점 : 디테일한 부분을 손보기가 편하다
상점 내 아이템을 변경하거나 할 때 수월하다
단점은 다시 던전으로 들어갈 때 씬 간 이동이 일어나므로 이 부분에서 문제가 발생하지 않도록 처리해주어야 한다.
씬 간 이동
씬의 Enter가 불릴 때 로컬 오브젝트들의 Awake가 불리므로, 상점에서 던전으로 갈 때 자꾸 Awake가 불릴 수 있다 (Awake에서는 주로 오브젝트가 가진 요소들을 씬에 추가하는 일을 한다)
던전의 Enter에서는 이런 부분을 특별히 처리해주어야 한다.
던전의 Local에는 어떤 것들이 있는가? 던전의 Enter에서는 현재 선택된 스테이지의 던전의 Enter가 호출되며, 해당 Enter에서는 던전이 소유한 오브젝트들의 Enter가 호출된다
던전이 소유한 오브젝트들은? Enter에서는 아무것도 해줄 것이 없다?
맵에 존재하는 것은 타일들, 배경, 플레이어블 상호작용오브젝트들.. 이 친구들은 파괴될 때 파티클을 뿌릴 뿐 아무런 역할도 하지 않는다
배경의 경우 PERSPECTIVE로 구현되어야 한다
이 부분들을 구현했을 때 직면할 문제들
플레이어블 상호작용 오브젝트 추가(미구현)
통과 가능한 타일들의 완벽한 구현
배경
이 부분들을 구현했을 때 쉬워지는 문제들
맵 생성
몬스터 관리
'게임 개발 > [D2D_Portfolio] DirectX2D 포트폴리오 작업일지' 카테고리의 다른 글
42. Dungeon Event 추가 및 툴을 이용한 Chapter3 기본 맵 생성 (0) | 2023.05.06 |
---|---|
41. 던전 오브젝트를 맵 파일에 포함 (0) | 2023.05.04 |
39. Camera 원근 투영 활용 (0) | 2023.05.02 |
38. ItemInfoUI 구현 & 마검 아이템 구현 및 장착 시 이펙트 구현 (0) | 2023.05.01 |
37. SkulItemUI 구현 완료 & Item 기초 작업 (0) | 2023.04.29 |
댓글