プレイヤーアニメーション
4474 ワード
今回は、ビットマップ画像を読み込み、プレーヤーの空きや移動時にアニメーションを追加します.
ビットマップイメージの追加
まず、ビットマップマネージャで画像を追加します.レッスンでは、右下隅の画像を含む4つのsprightを使用しました.
フレーム構造体
プレイヤークラス変数の追加
次に、プレイヤークラスにアニメーションを実装する変数を追加します.
次に、フレームの追加とステータスの変更のために、プレーヤークラスに2つの関数を実装します.
ChangeState()
プレイヤーの行動に応じて状態を変更できる関数を実装します.
前に実装した2つの関数は、Late Updateで繰り返し呼び出すことができます.
キーストロークの変更
入力した内容に基づいてプレーヤーの次の状態を変更できます.
ビットマップイメージの追加
まず、ビットマップマネージャで画像を追加します.レッスンでは、右下隅の画像を含む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;
}
Reference
この問題について(プレイヤーアニメーション), 我々は、より多くの情報をここで見つけました https://velog.io/@jacod2/플레이어-애니메이션テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol