Example #1
0
void CPlayer::Update(float fTimeElapsed)
{
	//플레이어의 속도 벡터를 중력 벡터와 더한다. 중력 벡터에 fTimeElapsed를 곱하는 것은
	// 중력을 시간에 비례하도록 적용한다는 의미.
	//m_d3dxvVelocity += m_d3dxvGravity * fTimeElapsed;

	//// 플레이어의 속도 벡터의 XZ-성분의 크기를 구함. 이것이 XZ-평면의 최대 속력보다
	//// 크면 속도 벡터의 x와 z방향 성분을 조정한다.
	//float fLength = sqrtf(m_d3dxvVelocity.x * m_d3dxvVelocity.x + m_d3dxvVelocity.z * m_d3dxvVelocity.z);
	//if (fLength > m_fMaxVelocityXZ)
	//{
	//	m_d3dxvVelocity.x *= (m_fMaxVelocityXZ / fLength);
	//	m_d3dxvVelocity.z *= (m_fMaxVelocityXZ / fLength);
	//}
	//
	//// 플레이어의 속도 벡터의 y성분의 크기를 구함. 이것이 y축방향의 최대속력보다 크면
	//// 속도 벡터의 y방향 성분을 조정한다.
	//fLength = sqrtf(m_d3dxvVelocity.y * m_d3dxvVelocity.y);
	//if (fLength > m_fMaxVelocityY) m_d3dxvVelocity.y *= (m_fMaxVelocityY / fLength);
	//
	//// 플레이어를 속도 벡터 만큼 이동한다. 속도 벡터에 fTimeElapsed를 곱하는 것은 속도를
	//// 시간에 비례하도록 적용의미.
	//Move(m_d3dxvVelocity*fTimeElapsed, false);
	
	// 플레이어의 위치가 변경될때 추가로 수행할 작업 수행
	// ex ) 플레이어 위치가 변경됫지만 플레이어 객체에는 지형정보가 없다.
	//		플레이어의 새로운 위치가 유효한 위치가 아닐수도 있고 또는 충돌 검사등을 수행할필요가있다.
	// 이런 상황에서 플레이어의 위치를 유효한 위치로 다시 변경

	DWORD nCurrentCameraMode = m_pCamera->GetMode();

	if (m_pPlayerUpdatedContext) OnPlayerUpdated(fTimeElapsed);
	
	// 플레이어의 위치가 변경 -> 카메라 상태 갱신
	if (nCurrentCameraMode == THIRD_PERSON_CAMERA) m_pCamera->Update(fTimeElapsed);
	
	// 카메라 위치가 변경될때 추가로 수행할 작업 수행
	if (m_pCameraUpdatedContext) OnCameraUpdated(fTimeElapsed);
	
	// 카메라가 3인칭 카메라면 카메라가 변경된 플레이어 위치를 바라보도록 한다.
	if (nCurrentCameraMode == THIRD_PERSON_CAMERA) m_pCamera->SetLookAt(m_d3dxvPosition);
	
	// 카메라의 카메라 변환 행렬 다시 생성
	m_pCamera->RegenerateViewMatrix();

	// 플레이어의 속도 벡터가 마찰력 때문에 감속이 되어야 한다면 감속 벡터를 생성.
	// 속도 벡터의 반대 방향 벡터를 구하고 단위 벡터로 만든다. 마찰 계수를 시간에 비례하도록
	// 하여 마찰력을 구함. 단위 벡터에 마찰력을 곱해 감속 벡터를 구함
	// 속도벡터에 감속벡터를 더하여 속도벡터를 줄인다.
	// 마찰력이 속력보다 크면 속력은 0

	//D3DXVECTOR3 d3dxvDeceleration = -m_d3dxvVelocity;
	//D3DXVec3Normalize(&d3dxvDeceleration, &d3dxvDeceleration);
	//
	//fLength = D3DXVec3Length(&m_d3dxvVelocity);
	//float fDeceleration = (m_fFriction * fTimeElapsed);
	//if (fDeceleration > fLength) fDeceleration = fLength;
	//m_d3dxvVelocity += d3dxvDeceleration * fDeceleration;
}
void CObject_Player::Update(float fTimeElapsed)
{
/*플레이어의 속도 벡터를 중력 벡터와 더한다. 중력 벡터에 fTimeElapsed를 곱하는 것은 중력을 시간에 비례하도록 적용한다는 의미이다.*/
	m_d3dxvVelocity += m_d3dxvGravity * fTimeElapsed;
	/*플레이어의 속도 벡터의 XZ-성분의 크기를 구한다. 이것이 XZ-평면의 최대 속력보다 크면 속도 벡터의 x와 z-방향 성분을 조정한다.*/
	float fLength = sqrtf(m_d3dxvVelocity.x * m_d3dxvVelocity.x + m_d3dxvVelocity.z * m_d3dxvVelocity.z);
	float fMaxVelocityXZ = m_fMaxVelocityXZ * fTimeElapsed;
    if (fLength > fMaxVelocityXZ)
    {
        m_d3dxvVelocity.x *= (fMaxVelocityXZ / fLength);
        m_d3dxvVelocity.z *= (fMaxVelocityXZ / fLength);    
    } 
	/*플레이어의 속도 벡터의 Y-성분의 크기를 구한다. 이것이 Y 축 방향의 최대 속력보다 크면 속도 벡터의 y-방향 성분을 조정한다.*/
	fLength = sqrtf(m_d3dxvVelocity.y * m_d3dxvVelocity.y);
	float fMaxVelocityY = m_fMaxVelocityY * fTimeElapsed;
    if (fLength > fMaxVelocityY) m_d3dxvVelocity.y *= (fMaxVelocityY / fLength);

//플레이어를 속도 벡터 만큼 실제로 이동한다(카메라도 이동될 것이다). 
	Move(m_d3dxvVelocity, false);

/*플레이어의 위치가 변경될 때 추가로 수행할 작업을 수행한다. 예를 들어, 플레이어의 위치가 변경되었지만 플레이어 객체에는 지형(Terrain)의 정보가 없다. 플레이어의 새로운 위치가 유효한 위치가 아닐 수도 있고 또는 플레이어의 충돌 검사 등을 수행할 필요가 있다. 이러한 상황에서 플레이어의 위치를 유효한 위치로 다시 변경할 수 있다.*/
	if (m_pPlayerUpdatedContext) OnPlayerUpdated(fTimeElapsed);

	DWORD nCurrentCameraMode = m_pCamera->GetMode();
//플레이어의 위치가 변경되었으므로 카메라의 상태를 갱신한다.
	if (nCurrentCameraMode == THIRD_PERSON_CAMERA) m_pCamera->Update(fTimeElapsed);
//카메라의 위치가 변경될 때 추가로 수행할 작업을 수행한다. 
	if (m_pCameraUpdatedContext) OnCameraUpdated(fTimeElapsed);
//카메라가 3인칭 카메라이면 카메라가 변경된 플레이어 위치를 바라보도록 한다.
	if (nCurrentCameraMode == THIRD_PERSON_CAMERA) m_pCamera->SetLookAt(m_d3dxvPosition);
//카메라의 카메라 변환 행렬을 다시 생성한다.
	m_pCamera->RegenerateViewMatrix();

/*플레이어의 속도 벡터가 마찰력 때문에 감속이 되어야 한다면 감속 벡터를 생성한다. 속도 벡터의 반대 방향 벡터를 구하고 단위 벡터로 만든다. 마찰 계수를 시간에 비례하도록 하여 마찰력을 구한다. 단위 벡터에 마찰력을 곱하여 감속 벡터를 구한다. 속도 벡터에 감속 벡터를 더하여 속도 벡터를 줄인다. 마찰력이 속력보다 크면 속력은 0이 될 것이다.*/
	D3DXVECTOR3 d3dxvDeceleration = -m_d3dxvVelocity;
	D3DXVec3Normalize(&d3dxvDeceleration, &d3dxvDeceleration);
	fLength = D3DXVec3Length(&m_d3dxvVelocity);
	float fDeceleration = (m_fFriction * fTimeElapsed);
	if (fDeceleration > fLength) fDeceleration = fLength;
	m_d3dxvVelocity += d3dxvDeceleration * fDeceleration;
}