본문 바로가기

Win32 api

Win32 api 강의 39 - 40화.

- 애니메이션 프레임에 Offset 추가.

struct tAnimationFrame
{
    Vector2 vStart;        // 프레임의 시작 위치.
    Vector2 vSize;         // 프레임의 크기.
    Vector2 vOffset;       // 프레임의 오프셋.

    float   fFrameDuration;  // 프레임의 지속 시간.
};

 

애니메이션 프레임 구조체에 오프셋 정보를 추가.

// CAnimation.cpp
...
void CAnimation::render(HDC hDC, Vector2 vPos)
{
    if (!m_pTexture)
        return;

    // 현재 프레임의 사각형 영역 계산.
    tAnimationFrame& frame = m_vecFrames[m_iCurFrame];

    // 오프셋 적용.
    Vector2 pos = vPos + frame.vOffset;

    // 텍스처에서 현재 프레임을 hDC에 렌더링.
    TransparentBlt(hDC,
        static_cast<int>(pos.x - frame.vSize.x * 0.5f), static_cast<int>(pos.y - frame.vSize.y * 0.5f),
        static_cast<int>(frame.vSize.x), static_cast<int>(frame.vSize.y),
        m_pTexture->GetDC(),
        static_cast<int>(frame.vStart.x), static_cast<int>(frame.vStart.y),
        static_cast<int>(frame.vSize.x), static_cast<int>(frame.vSize.y),
        RGB(255, 0, 255)); // 마젠타 색상을 투명색으로 사용.
}

 

오브젝트 위치 + 오프셋 보정을 해서, 애니메이션 이미지 위치를 원하는 위치로 보정할 수 있음.

구현하고자 하는 게임 장르 등에 따라 콜라이더와 캐릭터 이미지의 위치가 조금씩 달라지는데,

이걸 오프셋 입력을 통해 조정함.

 

- Camera 간단 구현.

// CCamera.h
#pragma once
class CObject;

class CCamera
{
    SINGLETON(CCamera)
private:
    Vector2         m_vPosition;        // 카메라 위치.
    CObject*        m_pTarget;          // 카메라가 따라다닐 타겟 오브젝트.

public:
    inline const Vector2& GetPosition() const { return m_vPosition; }
    inline void SetPosition(const Vector2& vPos) { m_vPosition = vPos; }

    inline void SetTarget(CObject* pTarget) { m_pTarget = pTarget; }

    inline Vector2 WorldToScreen(const Vector2& vWorldPos) const
    {
        return vWorldPos - m_vPosition;
    }

public:
    void update();
};

 

일반 오브젝트들의 스크린 좌표는 간단히 카메라 좌표를 뺀 상대 좌표로 하면 됨.

// CObject.cpp
...
void CObject::render(HDC hDC)
{
    // 렌더링 전에 카메라의 위치 보정 적용.
    Vector2 vRenderPos = CCamera::GetInstance()->WorldToScreen(m_ptPos);
    
    // 오브젝트의 렌더링 로직 구현.
    Rectangle(hDC,
        static_cast<int>(vRenderPos.x - (m_ptSize.x * 0.5f)),
        static_cast<int>(vRenderPos.y - (m_ptSize.y * 0.5f)),
        static_cast<int>(vRenderPos.x + (m_ptSize.x * 0.5f)),
        static_cast<int>(vRenderPos.y + (m_ptSize.y * 0.5f)));

    component_render(hDC);
}

 

그다음 이렇게 오브젝트의 좌표를 스크린 좌표로 바꿔서 그려주면

테스트로 카메라를 이동시켜보면 

오브젝트가 움직이지 않아도 상대 좌표를 계산하여 이동하는 것을 볼 수 있음.

'Win32 api' 카테고리의 다른 글

Win32 api 강의 43화.  (0) 2025.09.23
Win32 api 강의 41 - 42화.  (0) 2025.09.23
Win32 api 강의 37 - 38화.  (0) 2025.09.22
Win32 api 강의 35 - 36화.  (0) 2025.09.21
Win32 api 강의 34화.  (0) 2025.09.20