소유자인 해당 obj의 모든 animation을 map으로 저장하며 관리한다
animator도 컴포넌트이기 때문에 obj에서 복사생성을 다뤄줘야 함
map<wstring, CAnimation*> m_mapAnim;// 모든 애니메이션
CAnimation* m_pCurAnim;//현재 애니메이션
CObject* m_pOwner;// 이 animator 소유자
obj가 애니메이터에게 만들라고 하면 애니메이터 ani에게 만들라고 한다
void CAnimator::CreatAnimation(const wstring& _strName
, CTexture* _pTex
, Vec2 _vLT
, Vec2 _vSliceSize
, Vec2 _vStep
, float _fDuration
, UINT _iFrameCount);
매개 변수 정보:
애니메이션 이름
,텍스쳐 주소,
,자를 이미지 시작점
, 자를 이미지 크기
, 다음 이미지 시작점 간격
,한 프레임 당 시간
, 몇개의 이미지가 한 애니를 구성하는지
void CAnimation::Create(const wstring& _strName
, CTexture* _pTex
, Vec2 _vLT
, Vec2 _vSliceSize
, Vec2 _vStep
, float _fDuration
, UINT _iFrameCount)
{
tAnimFrm tAnifrm = {};
for (UINT i = 0; i < _iFrameCount; ++i)
{
tAnifrm.fDuration = _fDuration;
tAnifrm.vLT = _vLT+(_vStep*i);//각 프레임 자르는 LT위치 초기화
tAnifrm.vSlice = _vSliceSize;
m_vecFrm.push_back(tAnifrm);
}
m_strName = _strName;
m_pTex = _pTex;
m_vStep = _vStep;
m_iFraCount = _iFrameCount;
}
찾고자 하는 애니메이션이 map 존재 하는지 검색 있으면 반환
CAnimation CAnimator::FindAnimation(const wstring& _strName)
{
map<wstring, CAnimation>::iterator iter = m_mapAnim.find(_strName);
if (iter == m_mapAnim.end())
return nullptr;
return iter->second;
}
플레이하고자 하는 ani 이름,repeat 여부
void CAnimator::Play(const wstring& _strName,bool _repeat)
{
map<wstring, CAnimation*>::iterator iter = m_mapAnim.find(_strName);
if (iter == m_mapAnim.end())
{
return;
}
m_pCurAnim = iter->second;
m_repeat = _repeat;
}
각각의 한 프레임이 어떤 정보를 갖고 있는지 기억하는 용도
애니메이터와 애니메이션 서로 주소를 알게 해야한다
struct tAnimFrm//프레임 정보 구조체
{
Vec2 vLT;
Vec2 vSlice;
Vec2 vOffset;
float fDuration; //프레임 당 시간
bool m_bIs_InTroop;
};
class CAnimation
{
private:
wstring m_strName;
CAnimator* m_pAnimator;
CTexture* m_pTex;//Animation이 사용하는 텍스쳐
vector<tAnimFrm> m_vecFrm;//모든 프레임 정보
UINT m_iFraNum;
UINT m_iFraCount;
Vec2 m_vStep;
};
반복인지 아닌 지 여부,
진행시간이 프레임당 시간 보다 길어졌을때 처리
void CAnimation::update()
{
if (-1 == m_iFraNum)
return;
if (!m_vecFrm.size())
return;
m_frunningtime += fDT;
if (m_frunningtime >= m_vecFrm[m_iFraNum].fDuration)//진행 시간이 프레임당 시간보다 길면
{
m_frunningtime -= m_vecFrm[m_iFraNum].fDuration; 그 차이값을 다시 진행 시간으로
if (m_iFraCount - 1 == m_iFraNum)//마지막 프레임이라면
{
if (!m_pAnimator->Getrepeat())//반복 플레이가 아니라면
{
m_iFraNum = -1;//플레이가 끝났다
return;
}
m_iFraNum = 0;
}
else { ++m_iFraNum; }
}
}
출력되는 obj의 위치를 알아야지 그거에 맞게 렌더링 가능하다
애니메이션은 애니메이터를 알고 애니메이터는 obj를 알기 때문에 위치를 알수 있다
void CAnimation::render(HDC _dc)
{
if (m_strName == L"enemybee")
m_rgbTransRGB = { 31,31,31 };
transblt(_dc, m_rgbTransRGB);
}
void CAnimation::transblt(HDC _dc, rgb _TransRGB)
{
Vec2 vPos = m_pAnimator->GetpOwner()->GetPos();
vPos += m_vecFrm[m_iFraNum].vOffset;
vPos = CCamera::GetInst()->GetRenderPos(vPos);
TransparentBlt(_dc
//물체중심으로 부터 표현 하고자 하는 프레임의 x좌표 시작 위치
, int(vPos.x - (float)(m_vStep.x / 2.f))
, int(vPos.y - (float)(m_vStep.y / 2.f))// y 좌표 시작위치
, (int)m_vecFrm[m_iFraNum].vSlice.x
, (int)m_vecFrm[m_iFraNum].vSlice.y
, m_pTex->Get_dc()
, (int)m_vecFrm[m_iFraNum].vLT.x
, (int)m_vecFrm[m_iFraNum].vLT.y
, (int)m_vecFrm[m_iFraNum].vSlice.x
, (int)m_vecFrm[m_iFraNum].vSlice.y
, RGB(_TransRGB.sred, _TransRGB.sgreen, _TransRGB.sblue));
}