俺のジャンプ選手権 準備編 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
- キーボードを離す ⇒ IDLE
WALKの時
- 右が押された ⇒ signが+
- x = x + speed
- 左が押された ⇒ signがー
- x = x - speed