プレイヤーアニメーション

4474 ワード

今回は、ビットマップ画像を読み込み、プレーヤーの空きや移動時にアニメーションを追加します.
ビットマップイメージの追加
まず、ビットマップマネージャで画像を追加します.レッスンでは、右下隅の画像を含む4つのsprightを使用しました.

	CBitmap_Manager::Get_Instance()->Insert_Bitmap(L"../Image/Player/Player_DOWN.bmp", L"Player_DOWN");
	CBitmap_Manager::Get_Instance()->Insert_Bitmap(L"../Image/Player/Player_LEFT.bmp", L"Player_LEFT");
	CBitmap_Manager::Get_Instance()->Insert_Bitmap(L"../Image/Player/Player_RIGHT.bmp", L"Player_RIGHT");
	CBitmap_Manager::Get_Instance()->Insert_Bitmap(L"../Image/Player/Player_UP.bmp", L"Player_UP");
MainAppのReddyで、CBitMapManagerで4つのイメージを追加します.
フレーム構造体
typedef struct tagFrame
{
	int iFrameStart; //애니메이션의 시작시간 입니다 기본값 0으로 설정합니다
	int iFrameEnd; //애니메이션의 끝점 입니다 각 애니메이션마다 장수가 다르기때문에 이렇게 사용합니다.
	int iFrameState; // 현재 상태를 저장해놓는 변수입니다
	DWORD dwFrameSpeed; 
    //GetTickCount를 통해 시간값을 불러오고 이를통해 프레임을 제어해줍니다
	DWORD dwFrameTime; 
    // 프레임의 시간을 저장해놓는 변수입니다 GetTickCount를통해 초기화 합니다.
}FRAME;
構造体tagFrameを宣言して、アニメーションに必要な情報を含めます.
プレイヤークラス変数の追加
次に、プレイヤークラスにアニメーションを実装する変数を追加します.
public:
	enum STATE {IDLE, WALK, ATTACK, HIT, DIE};
// 상태를 표시하기위한 열거체입니다. 예제로 우선 IDLE과WALK를 만들어봅니다.
private:
	FRAME m_tFrame; //프레임 구조체를 통해 정보를 관리합니다
	TCHAR* m_pFrameKey; //프레임키로 저장한 이미지를 불러옵니다
	STATE m_eCurState; //FSM을이용해 상태변경을 관리하기위한변수입니다.
	STATE m_eNextState; //FSM을이용해 상태변경을 관리하기위한변수입니다.
変数を追加すると、Readyセクションで変数を初期化します.
	m_pFrameKey = L"Player_DOWN";
	m_tFrame.iFrameStart = 0; 
	m_tFrame.iFrameEnd = 3; 
	m_tFrame.iFrameState = 0; 
	m_tFrame.dwFrameSpeed = 100; 
	m_tFrame.dwFrameTime = GetTickCount(); 
プレイヤー関数の追加
次に、フレームの追加とステータスの変更のために、プレーヤークラスに2つの関数を実装します.
void MoveFrame(); 
void Change_State(); 
MoveFrame()
void CPlayer::MoveFrame()
{
	if (m_tFrame.dwFrameTime + m_tFrame.dwFrameSpeed < GetTickCount())
	{
		++m_tFrame.iFrameStart; 
		m_tFrame.dwFrameTime = GetTickCount(); 
	}
	if (m_tFrame.iFrameStart > m_tFrame.iFrameEnd)
		m_tFrame.iFrameStart = 0; 

}
dwFrameTime + m_tFrame.dwFrameSpeedは現在の時間に比べてフレームが増加し、FrameStartがEndを超えた場合は0に再初期化されます.これにより、4枚の画像が繰り返し出力されます.
ChangeState()
プレイヤーの行動に応じて状態を変更できる関数を実装します.
void CPlayer::Change_State()
{
	if (m_eCurState != m_eNextState)
	{
		switch (m_eNextState)
		{
		case CPlayer::IDLE:
			m_tFrame.iFrameStart = 0;
			m_tFrame.iFrameEnd = 3;
			m_tFrame.iFrameState = 0;
			m_tFrame.dwFrameSpeed = 100;
			m_tFrame.dwFrameTime = GetTickCount();
			break;
		case CPlayer::WALK:
			m_tFrame.iFrameStart = 0;
			m_tFrame.iFrameEnd = 5;
			m_tFrame.iFrameState = 1;
			m_tFrame.dwFrameSpeed = 100;
			m_tFrame.dwFrameTime = GetTickCount();
			break;
		case CPlayer::ATTACK:
			m_tFrame.iFrameStart = 0;
			m_tFrame.iFrameEnd = 5;
			m_tFrame.iFrameState = 2;
			m_tFrame.dwFrameSpeed = 100;
			m_tFrame.dwFrameTime = GetTickCount();
			break;
		case CPlayer::HIT:
			break;
		case CPlayer::DIE:
			break;
		default:
			break;
		}
		m_eCurState = m_eNextState; 
	}
}
FSMで現在の状態と以下の状態を比較し、m tFrame値を変更します.
前に実装した2つの関数は、Late Updateで繰り返し呼び出すことができます.
キーストロークの変更
入力した内容に基づいてプレーヤーの次の状態を変更できます.
int CPlayer::Update_GameObject()
{
	//각각 방향에 해당하는 프레임키로 변경해주고
    	//다음 상태를 WALK로 설정해줍니다.
	if (GetAsyncKeyState(VK_LEFT) & 0x8000)
	{
		m_tInfo.fX -= m_fSpeed;
		m_pFrameKey = L"Player_LEFT";
		m_eNextState = WALK;
		CScroll_Manager::Set_ScrollX(m_fSpeed);
	}
	else if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
	{
		m_tInfo.fX += m_fSpeed;
		m_pFrameKey = L"Player_RIGHT";
		m_eNextState = WALK;
		CScroll_Manager::Set_ScrollX(-m_fSpeed);
	}
	else if (GetAsyncKeyState(VK_UP) & 0x8000)
	{
		m_tInfo.fY -= m_fSpeed;
		m_pFrameKey = L"Player_UP";
		m_eNextState = WALK;
		CScroll_Manager::Set_ScrollY(m_fSpeed);
	}
	else if (GetAsyncKeyState(VK_DOWN) & 0x8000)
	{
		m_tInfo.fY += m_fSpeed;
		m_pFrameKey = L"Player_DOWN";
		m_eNextState = WALK;
		CScroll_Manager::Set_ScrollY(-m_fSpeed);
	}
	else
		m_eNextState = IDLE; 
        //키 입력이 들어오지 않을땐 IDLE로 해줍니다.
	if (GetAsyncKeyState(VK_SPACE) & 0x8000)
		m_bIsJump = true; 


	return OBJ_NOEVENT; 
}