본문 바로가기

Win32 api

Win32 api 강의 64 - 65화.

- 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