CAnimation 클래스의 update 함수를 수정하겠습니다.
m_iFrm의 값을 하나씩 증가하면서 모든
애니메이션을 순회하며 재생하죠.
그러다가 m_iFrm의 값이 m_vAnimInfo의 사이즈보다 크거나
같으면 m_iFrm값을 -1로 설정하고 모든 애니메이션이
재생되었다는 의미로 m_bFinish를 true로 설정합니다.
그리고 update 함수의 동작을 더 진행할 필요가 없으므로
m_accDT값을 0으로 설정하고 함수를 빠져나갑니다.
그게 아니고 아직 더 재생할 애니메이션이
남아 있다면 m_accDT에서, m_vAnimInfo에
저장된 데이터 중 현재 재생될 애니메이션이
갖고 있는m_fDuration의 값을 뺍니다.
그리고 다시 그 값을 m_accDT에 대입합니다.
이것이 의미하는 것은 m_accDT에 저장된 값이
m_fDuration값을 넘은 만큼 다음 프레임에 반영하겠다는 것이죠.
일반적으로 게임에서는
오브젝트의 콜리전( 충돌체 )이 발 쪽에 붙어 있습니다.
오브젝트 아래쪽에 콜리전이 있어야
바닥과의 충돌을 인식하기가 쉽기 때문이죠.
아래 그림과 같은 상황을 봅시다.
위 그림은 2D 게임에서 발생하는 상황입니다.
2D 게임은 X축과 Y축으로만 구성되어 있으나,
게임에 따라서는 화면의 위쪽이 조금 더 뒤쪽이고,
화면의 아래쪽이 더 앞쪽이라는 개념이 들어가
있는 경우가 있죠.
이 경우 더 뒤쪽에 있는 오른쪽 몬스터가 총알을 발사하면,
더 앞쪽에 있는 왼쪽 플레이어에게 데미지가 들어가지 않습니다.
그냥 캐릭터 뒤쪽을 지나갈 뿐이죠.
사실 총알의 콜리전도
몬스터 콜리전 앞에 생성이 됩니다.
근데 총알의 텍스처( 애니메이션 )가
위에 그려질 수 있는 이유는 Offset 덕분이죠.
총알의 콜리전으로부터 Offset의 값만큼
떨어진 위치에 텍스처를 그리는 겁니다.
이러한 이유로 애니메이션에는
Offset이라는 개념을 넣어 주는 게 좋겠죠?
CAnimation 클래스에서 한 애니메이션의
정보를 저장할 수 있는 구조체 tAnimFrame에
m_vOffset를 추가해 줍니다.
그리고 애니메이션을 화면상에 그릴 때,
오브젝트의 위칫값을 나타내는 변수 vObjPos에
애니메이션이 갖고 있는 Offset 정보인 m_vOffset의 값을
더하여 이 값을 다시 vObjPos에 대입합니다.
이러면 TransparentBlt 함수를 통해
화면상에 애니메이션을 그릴 때
Offset 정보가 반영된 자리에
애니메이션이 그려집니다.
참고로 Vec2형인 vObjPos와
m_vOffset 간의 += 연산이 가능한 이유는
Vec2 클래스에서 해당 연산자를
오버로딩했기 때문이죠.
이제 Offset이 적용된 위치에
애니메이션이 잘 출력되는지
확인하기 위해 플레이어를 생성할 때
Offset을 적용할 애니메이션을
FindAnimation 함수를 통해 얻습니다.
for 문을 돌면서 모든 애니메이션에
Offset을 적용할 겁니다.
( for 문에 사용한 GetMaxFrame 함수는
애니메이션의 개수를 출력해 주는 함수입니다. )
해당 애니메이션의 GetFrame 함수를 호출하여
for 문의 i값을 인자로 넘깁니다.
그럼 애니메이션이 존재하는
배열의 인덱스에 접근이 가능합니다.
해당 인덱스에 존재하는 여러 가지 정보 중
m_vOffset에 원하는 Offset값을 넣으면 되죠.
이후 실행하여 확인해 보면
오브젝트의 위치( 콜리전의 위치와 같죠. )로부터
m_vOffset에 대입한 값만큼 떨어진 위치에
애니메이션이 재생됩니다.
m_vOffset에 Vec(0, -50)을 대입하였더니
오브젝트( 초록색 테투리를 한 콜리전 )위치에서
살짝 위쪽에 링크( 노랑머리 캐릭터 ) 텍스처가 출력되는 것을
확인할 수 있습니다.
강의 출처 : https://www.youtube.com/watch?v=8W3347SONWQ&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=39
'Win32 API > 기초' 카테고리의 다른 글
Win32 API 기초 : Camera (2) (4) | 2024.10.05 |
---|---|
Win32 API 기초 : Camera (1) (2) | 2024.10.04 |
Win32 API 기초 : Animation (3) (0) | 2024.09.01 |
Win32 API 기초 : Animation (2) (0) | 2024.08.28 |
Win32 API 기초 : Animation (1) (0) | 2024.08.19 |