Animator,Animation

김태훈·2024년 1월 10일
0

Win32API

목록 보기
16/24
post-custom-banner

Animator

소유자인 해당 obj의 모든 animation을 map으로 저장하며 관리한다
animator도 컴포넌트이기 때문에 obj에서 복사생성을 다뤄줘야 함

변수 셋팅

	map<wstring, CAnimation*> m_mapAnim;// 모든 애니메이션
	CAnimation* m_pCurAnim;//현재 애니메이션
	CObject* m_pOwner;// 이 animator 소유자

현재 애니메이션만 update,render

create animation

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;
}

find

찾고자 하는 애니메이션이 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;

}

play

플레이하고자 하는 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;

}

Animation

각각의 한 프레임이 어떤 정보를 갖고 있는지 기억하는 용도
애니메이터와 애니메이션 서로 주소를 알게 해야한다

변수 셋팅

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;

};

update

반복인지 아닌 지 여부,
진행시간이 프레임당 시간 보다 길어졌을때 처리

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; }	
	}

}

render

출력되는 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));
}
profile
복습을 위한 핵심 내용 및 모작
post-custom-banner

0개의 댓글