본문 바로가기
게임 개발/[D2D_Portfolio] DirectX2D 포트폴리오 작업일지

48. 데미지 Font 처리 & Particle 움직이는 로직 변경

by 헛둘이 2023. 5. 15.

데미지 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 추가 및 키 아이콘 추가 

 

 

 

댓글