본문 바로가기
Win32 API/기초

Win32 API 기초 : Animation (4)

글: 시플마 2024. 9. 1.

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