Skip to content

第03回 入力と移動

前回: 第02回 ゲームループと描画 / 次回: 第04回 構造体と矩形

今回の授業内容

  • DXライブラリのキー入力でプレイヤーを動かす
  • 速度を使って毎フレームの移動量を管理する
  • 画面外へ出ないように座標を制限する
  • 押しっぱなしと押した瞬間の違いを確認する
  • 入力処理をInputクラスとして分ける

今回の開始状態

第02回終了時点では、プレイヤーの仮図形が画面下部に表示されています。
今回の終了時点では、矢印キーまたはWASDで上下左右に動けるようにします。

変更するファイル

ファイル変更内容
Input.h入力管理クラスを追加する
Input.cpp現在と前フレームのキー状態を記録する
Game.hInputと移動速度を追加する
Game.cpp入力更新、移動、画面内制限を追加する

Inputクラスを追加する

SourceInput.hInput.cppを追加します。
押しっぱなしはIsDown()、押した瞬間はIsPressed()で判定できるようにします。

cpp
class Input
{
public:
    void Update();
    bool IsDown(int key) const;
    bool IsPressed(int key) const;

private:
    char current[256] = {};
    char previous[256] = {};
};

Update()では、前回の入力を保存してから現在の入力を読みます。

cpp
void Input::Update()
{
    for (int i = 0; i < 256; ++i)
        previous[i] = current[i];

    GetHitKeyStateAll(current);
}

入力で座標を変える

Game.hInputと速度を持ちます。

cpp
Input input;
float playerSpeed = 4.0f;

MainLoop()では、Update()の前に入力を更新します。

cpp
input.Update();
Update();
Draw();

Game::Update()で移動方向を作り、最後に速度を掛けます。

cpp
float moveX = 0.0f;
float moveY = 0.0f;

if (input.IsDown(KEY_INPUT_LEFT) || input.IsDown(KEY_INPUT_A))
    moveX -= 1.0f;
if (input.IsDown(KEY_INPUT_RIGHT) || input.IsDown(KEY_INPUT_D))
    moveX += 1.0f;
if (input.IsDown(KEY_INPUT_UP) || input.IsDown(KEY_INPUT_W))
    moveY -= 1.0f;
if (input.IsDown(KEY_INPUT_DOWN) || input.IsDown(KEY_INPUT_S))
    moveY += 1.0f;

playerX += static_cast<int>(moveX * playerSpeed);
playerY += static_cast<int>(moveY * playerSpeed);

画面外へ出ないようにする

移動後に、座標を画面内へ戻します。
プレイヤーの見た目の半分を余白として使います。

cpp
if (playerX < 18) playerX = 18;
if (playerX > screenWidth - 18) playerX = screenWidth - 18;
if (playerY < 32) playerY = 32;
if (playerY > screenHeight - 24) playerY = screenHeight - 24;

動作確認

  1. 矢印キーとWASDの両方で移動できることを確認する
  2. 画面端でプレイヤーが止まることを確認する
  3. playerSpeed2.0f8.0fへ変えて操作感を比較する
  4. IsPressed()を使うと押した瞬間だけ反応することを短い表示で確認する

よくある問題

  • 入力が反応しない場合は、input.Update()Update()より前に呼んでいるか確認する
  • Input.cppを作っただけでプロジェクトへ追加していないと、リンクエラーになる
  • 斜め移動が速く感じる場合は、次回以降でベクトルとして整理する

今回の完成条件

  • Inputクラスを追加できる
  • 押しっぱなしの入力でプレイヤーを移動できる
  • プレイヤーを画面内に制限できる
  • 押しっぱなしと押した瞬間の違いを説明できる

まとめ

今回は、入力を読み取って座標を変化させました。
次回は、位置や範囲を構造体でまとめ、当たり判定の準備をします。