데미지 Font 처리
- 데미지의 경우 기존에 구현해놨던(FW1FontWrapper 라이브러리를 이용한) Font 엔진을 토대로 처리했다.
- 월드 좌표에 있는 물체의 위치를 스크린 좌표로 옮겨서 출력해줘야 했기 떄문에 월드 좌표에서 스크린 좌표로의 좌표 변환이 필요했고 아래와 같이 처리했다.
Vec3 Scenes::WorldToScreenPosition(const Vec3& vPoint, shared_ptr<Camera> pCamera)
{
int32 iWidth = g_pEngine->GetWidth();
int32 iHeight = g_pEngine->GetHeight();
Matrix matView = pCamera->GetViewMatrix();
Matrix matProjection = pCamera->GetProjectionMatrix();
Matrix matFinal = matView * matProjection;
Vec3 vScreenPos = XMVector3TransformCoord(vPoint, matFinal);
vScreenPos.x = iWidth * ((vScreenPos.x + 1) / 2.f);
vScreenPos.y = iHeight * ((1.f - vScreenPos.y) / 2.f);
vScreenPos.z = vPoint.z;
return vScreenPos;
}
- 사실 구현 자체는 ScreenToWorldPosition의 역순이라 구현하기 편한 부분이 있었다.
- 우선 View Matrix와 Projection Matrix를 통해 클립 좌표계로 이동시켜준 후, 해당 좌표에 현재 스크린의 비율에 맞게 변경해주는 과정을 거침으로써 좌표 변환이 완료된다.
(Screen 좌표계는 우선 범위가 좌상단이 0, 0이고, 0~width, 0~height의 범위로 이루어져있기 때문에 기존 -1~1 범위인 NDC 좌표계를 위와 같은 공식으로 변환하게 된다. 눈여겨볼 점은 y축의 경우 위에서 아래로 내려갈수록 값이 커지기 때문에 x축과 계산 공식이 다르다)
그 후 아래와 같이 데미지 구조체를 받아서, 매 프레임 값을 갱신하고 처리해준다.
struct DamageInfo
{
DAMAGE_TYPE eDamageType;
Timer tDuration;
float fDamage;
Vec3 vDamagePos;
};
void Font::DrawDamage(DAMAGE_TYPE eDamageType, float fDamage, const Vec3& vPos)
{
// 변화하는 위치값만 가지고 관리하면 된다.
// 글자 색상, 크기는 정해져 있기 때문
// 데미지 구조체를 두고, 시간 간격에 따라 올라갔다가 내려오는 모션
Vec3 vNewVec = vPos;
vNewVec.y += 30.f;
m_vDamages.push_back(DamageInfo{ eDamageType, 0.5f, fDamage, vNewVec });
}
- DrawDamage에서 위치값의 y값을 변경해주는 이유는 객체의 위치보다 더 위쪽에 폰트가 표시되어야 하기 때문이다.
Particle 움직이는 로직 변경
- 여기서 얘기하는 Particle은 Particle System에서 얘기하는 Particle과 몬스터가 죽고 나서 생성되는 파편들 모두를 이야기하는 것인데, 기존 Particle의 경우 enum값을 통해 Particle이 날아갈 범위를 설정하고, 날아가는 속도는 상수값으로 둬서 날아가게 했다.
- 이렇게 처리하니 발생하는 문제점은 모든 파티클이 비슷한 속도로 날아가고 그러다보니 좀 심심하다는 생각이 들었다.
- 차라리 벡터를 넘겨서 그 벡터를 통해 범위를 정하는게 낫다는 생각이 들었고, 전달받은 벡터를 중심으로 각도를 추출한 후, 그 각도 ±15도를 통해 나름의 랜덤을 부여했다.
- 그리고 날아가는 속도는 해당 벡터의 길이를 구해서 곱해줌으로써 최종적으로 내가 부여한 상황에 따라 다이나믹한 움직임을 보여줄 수 있도록 수정했다.
- 그리고 몬스터가 죽어서 남긴 파티클들은 물리엔진에 의해 이리저리 움직이게 되는데, 바닥에 뒹굴다가 플레이어가 가진 아이템의 효과나 스컬이 가진 스킬에 의해 상호작용해야 한다.
- 따라서 이 부분을 아이템이 생성하는 이펙트나 해당 스컬의 공격을 담당하는 클래스에서 처리하도록 수정했고,
현재 추가되어 있는 마검 키리온에 대한 대쉬 이펙트는 이 부분을 추가해주었고 파티클들과 상호작용하는 것을 확인했다.
내일 할 일
- 플레이어 스컬 보완작업 (파티클들과의 상호작용 등)
- 대마도사 스킬 1개 더 추가
- 2번째 스킬 ui 추가 및 키 아이콘 추가
'게임 개발 > [D2D_Portfolio] DirectX2D 포트폴리오 작업일지' 카테고리의 다른 글
50. 몬스터 추가 및 비헤이비어 트리 개선 (0) | 2023.05.18 |
---|---|
49. AbyssOrb Skill 구현 & Particle 상호작용 추가 (0) | 2023.05.16 |
47. Light 및 Deco Object를 툴에 추가 (1) | 2023.05.14 |
46. Dungeon Reward 상호 작용 및 Bone Reward 구현 (0) | 2023.05.13 |
45. Dungeon Reward 구현 (0) | 2023.05.12 |
댓글