Appearance
第03回 入力と移動
前回: 第02回 ゲームループと描画 / 次回: 第04回 構造体と矩形
今回の授業内容
- DXライブラリのキー入力でプレイヤーを動かす
- 速度を使って毎フレームの移動量を管理する
- 画面外へ出ないように座標を制限する
- 押しっぱなしと押した瞬間の違いを確認する
- 入力処理を
Inputクラスとして分ける
今回の開始状態
第02回終了時点では、プレイヤーの仮図形が画面下部に表示されています。
今回の終了時点では、矢印キーまたはWASDで上下左右に動けるようにします。
変更するファイル
| ファイル | 変更内容 |
|---|---|
Input.h | 入力管理クラスを追加する |
Input.cpp | 現在と前フレームのキー状態を記録する |
Game.h | Inputと移動速度を追加する |
Game.cpp | 入力更新、移動、画面内制限を追加する |
Inputクラスを追加する
SourceにInput.hとInput.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.hでInputと速度を持ちます。
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;動作確認
- 矢印キーとWASDの両方で移動できることを確認する
- 画面端でプレイヤーが止まることを確認する
playerSpeedを2.0fや8.0fへ変えて操作感を比較するIsPressed()を使うと押した瞬間だけ反応することを短い表示で確認する
よくある問題
- 入力が反応しない場合は、
input.Update()をUpdate()より前に呼んでいるか確認する Input.cppを作っただけでプロジェクトへ追加していないと、リンクエラーになる- 斜め移動が速く感じる場合は、次回以降でベクトルとして整理する
今回の完成条件
Inputクラスを追加できる- 押しっぱなしの入力でプレイヤーを移動できる
- プレイヤーを画面内に制限できる
- 押しっぱなしと押した瞬間の違いを説明できる
まとめ
今回は、入力を読み取って座標を変化させました。
次回は、位置や範囲を構造体でまとめ、当たり判定の準備をします。