2 / 3 速度変数による往復移動
オレンジ色のロボットを自動で移動させ、左右の画面端で往復させます。座標を画面内へ戻す処理と、speed = -speed; で進む向きを反転する処理を組み合わせます。
速度変数の導入と自動直進
オレンジ色のロボットに自律的な移動処理を組み込みます。1フレームあたりに進むピクセル量を保持する変数 speed を用意します。
速度の初期化と座標への加算
ループの前にある int walkerY = 300; の直後に、次の変数宣言を追加してください。
int walkerY = 300;
int speed = 2;続いて、メインループ内の青いロボットの境界処理の直後(ClearDrawScreen(); の前)に、次の1行を追加します。
walkerX = walkerX + speed;
ClearDrawScreen();符号付き速度の概念
この行は if 文などの条件分岐に囲まれていないため、メインループが1周するたびに無条件で実行されます。
speed = 2の場合:毎フレームwalkerXに +2 されるため、右方向へ進みます。speed = -2の場合:毎フレームwalkerXに -2 されるため、左方向へ進みます。
このように、物理やゲーム数学における「速度(velocity)」は、数値の大きさ(絶対値)が移動の速さを表し、符号(正・負)が進む向きを表します。
初期値 speed = 2; で実行すると、キー操作をしなくてもオレンジ色のロボットが右へ進んでいくことを確認できます。
画面端での座標補正と速度反転
このままでは右端を突き抜けて画面外へ消えてしまうため、画面端に達したときに「座標を境界内に戻し、進行方向を真逆にする」処理を追加します。
左右の画面端での判定処理の追加
walkerX = walkerX + speed; の直後に、次のコードを追加してください。
walkerX = walkerX + speed;
if (walkerX > 640 - 48)
{
walkerX = 640 - 48;
speed = -speed;
}
if (walkerX < 0)
{
walkerX = 0;
speed = -speed;
}
ClearDrawScreen();速度の符号と進む向き
speed = -speed; は、現在の速度の符号を反転して保存します。
speed = -speed;-speed:① 符号を反転speed:② 結果を代入
2 なら -2 となって左へ進み、-2 なら 2 となって右へ進みます。値の前の - は符号を反転する記号です。
波括弧による補正と反転のひとまとめ
また、画面端を突破した瞬間に「① 座標を境界(592 または 0)に戻す」「② 速度の符号を反転する」という2つの処理を同時に実行するため、if の処理対象を波括弧 { } で囲んでブロック化しています。
画面端での座標と速度の追跡
画面端を超えたフレームの値の変化
画面端に近づいたときの座標と速度を、処理の順に追ってみましょう。
| タイミング | フレーム開始時の状態 | 座標加算後(直後) | 境界判定・補正後 | 次のフレームの挙動 |
|---|---|---|---|---|
| 右端衝突時 | walkerX = 591, speed = 2 | walkerX = 593(端突破) | walkerX = 592, speed = -2 | 左方向(-2px)へ移動開始 |
| 左進中 | walkerX = 590, speed = -2 | walkerX = 588 | 判定不成立(変化なし) | 左方向へ継続移動 |
| 左端衝突時 | walkerX = 1, speed = -2 | walkerX = -1(端突破) | walkerX = 0, speed = 2 | 右方向(+2px)へ移動開始 |
速度変数 speed をループの外で宣言しているため、反転した符号(-2 や 2)は次のフレーム以降もメモリ上に記憶され続けます。
自動往復とキー操作の同時確認
ビルドして実行してみましょう。オレンジ色のロボットが左右の画面端で反転し、自動で往復を続けるはずです。また、その最中に青いロボットをキーボードで操作し、2体が独立して同時に動く様子を観察してください。
- 速度の符号(正・負)が進行方向を決定する仕組みを説明できる
-
speed = -speed;によって進行方向が反転する数学的理由を理解している - 左右の画面端で正しく跳ね返り、画面内を自動往復することを確認した