- RigidBody 구현.
// CRigidBody.h
...
class CRigidBody : public CComponent
{
private:
CObject* m_pOwner;
Vector2 m_vForce; // 힘.
Vector2 m_vAcceleration; // 가속도.
Vector2 m_vVelocity; // 속도.
float m_fMass; // 질량.
public:
void AddForce(const Vector2& force) { m_vForce += force; }
public:
void late_update();
public:
CRigidBody();
CRigidBody(const CRigidBody& other);
virtual ~CRigidBody();
friend class CObject;
};
기존 SetPos 를 통한 위치 업데이트 방식으로 Player 를 움직였는데, 이제 RigidBody 를 이용해 힘을 적용하여 움직임.
// CRigidBody.cpp
...
void CRigidBody::late_update()
{
if (!m_pOwner)
return;
// 질량이 0이 아닌지 확인.
if (m_fMass <= 0.f)
return;
// 힘을 이용해 가속도 계산.
m_vAcceleration = m_vForce / m_fMass;
// 가속도를 이용해 속도 갱신.
m_vVelocity += m_vAcceleration * DELTATIMEF;
// 속도를 이용해 위치 갱신.
Vector2 newPos = m_pOwner->GetPos() + m_vVelocity * DELTATIMEF;
m_pOwner->SetPos(newPos);
// 속도에 마찰력 적용 (속도를 줄임).
m_vVelocity *= 0.99f; // 마찰 계수 (0.98은 예시, 필요에 따라 조정 가능)
// 속도가 매우 작아지면 0으로 설정 (정지 상태로 간주).
if (m_vVelocity.lengthSquared() < 0.01f * 0.01f) // 0.01은 예시, 필요에 따라 조정 가능
{
m_vVelocity = Vector2::zero;
}
// 프레임이 끝나면 힘을 초기화.
m_vForce = Vector2::zero;
}
마찰계수를 일단 0.01 로 설정. 마찰력이 없으면 힘을 주는 순간 가속이 멈추지 않는다.
// CPlayer.cpp
...
void CPlayer::update()
{
CRigidBody* pRB = GetRigidBody();
if (pRB)
{
float fForceAmount = 20000.f;
if(KEYHOLDCHECK(KEY::LEFT))
{
pRB->AddForce(fForceAmount * Vector2::left);
}
...
기존 코드는 CObject::SetPos 를 통해 직접 위치를 조정하였음.
RigidBody 를 통해 물리 계산으로 위치를 조정한다.
'Win32 api' 카테고리의 다른 글
| Win32 api 강의 66 - 76화. (0) | 2025.10.12 |
|---|---|
| Win32 api 강의 63화. (0) | 2025.10.01 |
| Win32 api 강의 62화. (0) | 2025.09.30 |
| Win32 api 강의 59 - 61화. (0) | 2025.09.30 |
| Win32 api 강의 57 - 58화. (0) | 2025.09.29 |