2 / 3 キー入力による移動制御
キーが押されているかを調べ、操作に応じてキャラクターの座標を変えます。上下左右への移動と座標の増減、複数のキーを同時に押したときの動きを学びます。
右キー押下による移動条件の追加
前のステップでは、キーを押さなくてもキャラクターが右へ進み続けました。今度は、右キーを押している間だけ進むように変えます。右キーを表す定数はKEY_INPUT_RIGHTです。
右キーの判定コードの追加
ループ先頭のx = x + 3;を、次のif文に置き換えてください。
if (CheckHitKey(KEY_INPUT_RIGHT) != 0)
x = x + 3;押している間だけ座標を更新する条件
ifでは、丸括弧内の条件が成立するときだけ直後の処理を実行します。今回の条件CheckHitKey(KEY_INPUT_RIGHT) != 0で調べるのは、右キーが押されているかどうかです。
CheckHitKeyは、キーを離していると0、押していると0以外を返します。!=は「等しくない」という意味です。戻り値が0でないときだけ、x = x + 3;を実行します。
保存して実行し、右キーを押すと進み、離すと停止することを確認してください。
四方向(上下左右)の移動制御
四方向の判定コードへの置き換え
続いて、上下左右すべての方向キーで移動できるようにします。右キーの判定は残してください。その前に左キー、その後に上キーと下キーの判定を追加します。次の例で+が付いた6行を書き加えてください。
if (CheckHitKey(KEY_INPUT_LEFT) != 0)
x = x - 3;
if (CheckHitKey(KEY_INPUT_RIGHT) != 0)
x = x + 3;
if (CheckHitKey(KEY_INPUT_UP) != 0)
y = y - 3;
if (CheckHitKey(KEY_INPUT_DOWN) != 0)
y = y + 3;画面座標系と加減算の関係
各方向への移動では、画面座標の向きに合わせて数値を増減します。
| キー | 定数 | 座標の更新 | 移動方向 |
|---|---|---|---|
| 左 | KEY_INPUT_LEFT | x = x - 3 | xを減らして左へ進む |
| 右 | KEY_INPUT_RIGHT | x = x + 3 | xを増やして右へ進む |
| 上 | KEY_INPUT_UP | y = y - 3 | yを減らして上へ進む |
| 下 | KEY_INPUT_DOWN | y = y + 3 | yを増やして下へ進む |
画面座標の原点(0, 0)は左上です。下へ進むほどyが増えるため、上へ移動するときはyを減らしてください。
if文の波括弧を省略できる条件
上のif文には波括弧{ }がありません。省略すると、条件付きで実行するのは直後の1文だけです。セミコロンまでが一つの文で、字下げの深さでは実行する範囲は変わりません。複数の文を条件付きで実行する場合は、必ず{ }で囲んでください。
同時押し時の挙動
四つのif文は、それぞれ独立した判定です。上から順に条件を調べます。
右キーと下キーを同時に押すと、xとyにそれぞれ3を足します。その結果、右下へ斜めに移動します。左キーと右キーを同時に押した場合は、xから3を引いた後で3を足すため、移動量が打ち消されてロボットはその場に止まります。
入力判定と速度設定の検証
キー操作と停止の確認
ビルドして実行し、ウィンドウをクリックしてから操作してください。上下左右と斜めに移動し、キーを離すと止まることを確認します。
下方向だけ移動量を変える実験
移動を確認したら、移動量の数値を変えてください。例えば、下キーの処理だけをy = y + 6;に書き換えます。
他の方向の速度は変わらず、下へ進むときだけ移動量が倍になります。キーごとに加減算する数値を変えると、その方向の移動速度を調整できます。
確認を終えたら、移動量を元の3に戻してください。
斜め移動を比べる場合
上下のキーと左右のキーを同時に押すと、xとyの両方が変わります。そのため、1フレームの移動距離は直線移動より長くなります。今回はキーごとの入力判定を学び、速度をそろえる処理は追加しません。
- キーを押している間だけ移動し、離すと停止する仕組みを説明できる
- 上下左右の移動において、なぜ上移動が減算で下移動が加算なのかを画面座標系の観点から説明できる
- 複数キーの同時押し時に移動が合成・相殺される理由をコードから説明できる