俺のジャンプ選手権 準備編 Part2

キーボード状態の取得

キーボードの状態をとる関数を作るよ(コピペ、またはファイルコピー)
細かいことは、ここが詳しいです

Listing. 1: キーボード状態の取得
namespace Input {
	//キーボード取得関連
	void KeyStateUpdate();
	bool IsKeyUP(int keyCode);
	bool IsKeyDown(int keyCode);
	int IsKeepKeyDown(int keyCode);
}

こんな関数を作って、キーボードの押した瞬間、離した瞬間、押しっぱなしかどうか、を判別する!

主人公の状態の追加(歩く、止まる)

enumを使って、主人公の状態を変数化する。
今は、歩く(WALK)、何もしない(IDLE)のみ。

Listing. 2: 主人公の状態を変数化
"theMain.cpp"
#include "DxLib.h"
#include "Input.h"
 
//位置を表す構造体
struct Vec2D
{
	float x;
	float y;
};
 
enum CHR_STATE
{
	IDLE, //アイドリング
	WALK, //歩き
	MAX_CHR_STATE //最大値
};
 
 
namespace
{
	const int WIN_WIDTH = 1024;
	const int WIN_HEIGHT = 768;
	int hGroundImage = -1;
	float groundH = 600;
	int BoxW = 64;
	int BoxH = 128;
	Vec2D BoxPos = { 100, groundH - BoxH };
	float speed = 2;
	CHR_STATE myState = IDLE;
}
 
void DxInit()
{
	ChangeWindowMode(true);
	SetWindowSizeChangeEnableFlag(false, false);
	SetMainWindowText("TITLE");
	SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32);
	SetWindowSizeExtendRate(1.0);
	SetBackgroundColor(255, 250, 205);
 
	// DXライブラリ初期化処理
	if (DxLib_Init() == -1)
	{
		DxLib_End();
	}
 
	SetDrawScreen(DX_SCREEN_BACK);
}
 
 
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
	DxInit();
 
	hGroundImage = LoadGraph("Image\\bg_dote.jpg");
 
	while (true)
	{
		ClearDrawScreen();
		Input::KeyStateUpdate();
 
		static float chrSpeed = 0;//歩いてたらspeed,歩いてなかったら0
		static float sign = 0; //右向いてるか左向いてるか 右 1, 左 -1
 
 
		DrawExtendGraph(0, 0, WIN_WIDTH, WIN_HEIGHT + 1, hGroundImage, FALSE);
		DrawLine(0, groundH, WIN_WIDTH, groundH, GetColor(255, 0, 0), 2);
		if (Input::IsKeyDown(KEY_INPUT_LEFT) || Input::IsKeyDown(KEY_INPUT_A)) {
			//BoxPos.x = BoxPos.x - speed;
			myState = WALK;
			sign = -1.0;
		}
		else if(Input::IsKeyDown(KEY_INPUT_RIGHT) || Input::IsKeyDown(KEY_INPUT_D))
		{
			//BoxPos.x = BoxPos.x + speed;
			myState = WALK;
			sign = 1.0f;
		}
 
		if (Input::IsKeyUP(KEY_INPUT_LEFT) || Input::IsKeyUP(KEY_INPUT_A)) {
			myState = IDLE;
			sign = 0.0;
		}
		else if (Input::IsKeyUP(KEY_INPUT_RIGHT) || Input::IsKeyUP(KEY_INPUT_D))
		{
			myState = IDLE;
			sign = 0.0;
		}
		if (myState == WALK)
			chrSpeed = speed;
		else
			chrSpeed = 0;
 
		BoxPos.x = BoxPos.x + sign * chrSpeed;
 
		DrawBox(BoxPos.x, BoxPos.y, BoxPos.x + BoxW, BoxPos.y + BoxH, GetColor(0, 255, 0), TRUE);
		DrawFormatString(20, 20, GetColor(0, 0, 0), "%d", myState);
		ScreenFlip();
		WaitTimer(16);
		if (ProcessMessage() == -1)
			break;
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
			break;
	}
 
	DxLib_End();
	return 0;
}

主人公の状態を導入することで、主人公の状態の更新、キャラクタの移動、の処理をまとめて部分的な処理として分離することができた!

WALKの時