===== 俺のジャンプ選手権 準備編 Part2 =====
==== キーボード状態の取得 ====
キーボードの状態をとる関数を作るよ(コピペ、またはファイルコピー)\\
細かいことは、[[https://qiita.com/kiku09020/items/dee0ae3bce2186ac7d8e|ここが詳しいです]]\\
キーボード状態の取得
namespace Input {
//キーボード取得関連
void KeyStateUpdate();
bool IsKeyUP(int keyCode);
bool IsKeyDown(int keyCode);
int IsKeepKeyDown(int keyCode);
}
こんな関数を作って、キーボードの押した瞬間、離した瞬間、押しっぱなしかどうか、を判別する!\\
==== 主人公の状態の追加(歩く、止まる) ====
enumを使って、主人公の状態を変数化する。\\
今は、歩く(WALK)、何もしない(IDLE)のみ。\\
主人公の状態を変数化
#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
* キーボードを離す ⇒ IDLE
WALKの時
* 右が押された ⇒ signが+
* x = x **+** speed
* 左が押された ⇒ signがー
* x = x **-** speed