「右へ進むときはちょうどいいのに、右と上を一緒に押すと急に速くなる」。子どもがScratchで見下ろし型のゲームを作っていると、そんな違いが気になることがあります。
縦横と斜めの速さをそろえるには、横と縦の入力を先に調べ、斜めに進むときだけ、それぞれの移動量を「2の平方根」で割ります。横にも縦にも同じ量だけ動かすと、斜め方向の移動距離が長くなるためです。ここでは、壁やジャンプのない平面移動を例に、組み方と確かめ方を紹介します。
斜め移動が速いのは、横と縦の移動が合わさるから
たとえば、右キーで「x座標を4ずつ変える」、上キーで「y座標を4ずつ変える」と組んだとします。右だけなら横へ4進みますが、右と上を同時に押すと、横へ4、縦へ4進みます。
このとき、出発点から到着点までの直線距離は約5.66です。横だけの4と比べると、約1.41倍になります。これは例の数値から求めた計算値で、実際の作品で測定した結果ではありません。
Scratchでは、x座標の増加が右への移動、減少が左への移動です。y座標は増えると上、減ると下へ進みます。座標の働きは、公式ヘルプのx座標を変えるブロックとy座標を変えるブロックでも確認できます。
右上に進むとき、横と縦をそれぞれ約2.83にすると、合計した直線距離は約4になります。横方向の数値だけを見ると小さくなりますが、進行方向全体では同じ距離になる、という調整です。
準備するのは、動かすスプライトと4つの変数
まずは、本番の作品とは別の試作用プロジェクトで組むと、ほかの動きと混ざらず確認できます。キャラクターは1体にし、壁判定や自動移動は入れません。
動かすスプライトを選び、次の変数を作ってください。この例では、そのキャラクター専用の値として「このスプライトのみ」を選びます。
| 変数名 | 担当すること |
|---|---|
| 横入力 | 右なら1、左なら−1、横に進まないなら0 |
| 縦入力 | 上なら1、下なら−1、縦に進まないなら0 |
| 基本の速さ | 縦または横へ進むときの、繰り返し1回あたりの移動量 |
| 今回の移動量 | 斜めの補正を反映した、各軸に使う移動量 |
ここでの「速さ」は、1秒あたりの距離ではありません。プログラムの繰り返し1回で、どれだけ位置を変えるかを表す名前です。まずは説明用の設定値として、基本の速さを4にします。
キーの判定には、「イベント」の「キーが押されたとき」ではなく、「調べる」にある六角形の「キーが押された」を使います。押している間の状態を繰り返し調べる方法は、Scratch公式ヘルプのキー判定の説明でも案内されています。
「入力を調べる→斜めを判定→移動する」と組む
ポイントは、キーを見つけるたびにキャラクターを動かさないことです。先に横と縦の入力をそろえ、今回どちらへ進むのかが決まってから移動します。
以下はブロックの組み方を文字で表したものです。貼り付けて実行するコードではないため、Scratchの画面で対応するブロックを組んでください。字下げした部分は、直前の「ずっと」や「もし」の内側に入れます。
緑の旗が押されたとき
基本の速さを 4 にする
x座標を 0、y座標を 0 にする
ずっと
横入力を 0 にする
縦入力を 0 にする
もし「右向き矢印キーが押された」なら
横入力を 1 ずつ変える
もし「左向き矢印キーが押された」なら
横入力を -1 ずつ変える
もし「上向き矢印キーが押された」なら
縦入力を 1 ずつ変える
もし「下向き矢印キーが押された」なら
縦入力を -1 ずつ変える
今回の移動量を「基本の速さ」にする
もし「横入力が0ではない」かつ「縦入力が0ではない」なら
今回の移動量を「基本の速さ ÷ 2の平方根」にする
x座標を「横入力 × 今回の移動量」ずつ変える
y座標を「縦入力 × 今回の移動量」ずつ変える
条件の「0ではない」は、等しいと「ではない」を重ねる
「横入力が0ではない」という名前の専用ブロックを探す必要はありません。「演算」の「横入力=0」を「ではない」に入れます。縦入力も同じように作り、2つを「かつ」でつないでください。
これで、横と縦の両方に移動の指示があるときだけ、補正が働きます。右と左を同時に押した場合は、1と−1が打ち消し合って横入力が0になる設計です。
平方根は、演算ブロックのメニューから選ぶ
「演算」にある関数を選べる丸いブロックで「平方根」を選び、数値に2を入れます。それを割り算の右側へ入れ、「基本の速さ ÷ 2の平方根」を作ります。
「平方根」という日本語の表示はScratch公式の日本語翻訳データで、平方根を計算する処理は公式の演算ブロック実装で確認できます。
子どもがまだ平方根を習っていなくても、ここで公式を暗記する必要はありません。「斜めは2方向へ動くので、それぞれを少し短くしている」と、画面の動きと結び付けて扱えます。
お子さまに合う学び方診断
正解・不正解を決める診断ではありません。今の様子から、取り組みやすい学び方の入口をご案内します。
速さがそろったかは、同じ回数だけ動かして比べる
キーを押す時間を手加減でそろえるより、繰り返し回数を固定すると比較しやすくなります。確認するときだけ、先ほどの「ずっと」を「10回繰り返す」に置き換えてください。中身は変えません。
- 基本の速さを4にし、開始位置をx=0、y=0にする。
- 右キーを押したまま、マウスで緑の旗をクリックする。
- 終了後のx座標とy座標を記録する。
- 次は右と上を押したまま旗をクリックし、同じように記録する。
キーは旗をクリックする前から押します。繰り返しの途中で押し始めると、入力された回数がそろいません。端に触れない場所で、ほかに座標を変える処理がない状態で比べてください。
| 操作・設定 | 10回後の座標の計算上の目安 | 出発点からの直線距離 |
|---|---|---|
| 右のみ | x=40、y=0 | 40 |
| 右+上、補正なし | x=40、y=40 | 約56.57 |
| 右+上、補正あり | x=約28.28、y=約28.28 | 約40 |
表は、この設定から計算した比較用の値です。座標の表示が丸められている場合、見えている数値と細かな桁まで一致するとは限りません。確認が終わったら「10回繰り返す」を「ずっと」に戻し、左上や右下でも動かしてみましょう。
調整が反映されないときは、この組み方の3点を確認
斜めがまだ速い場合は、以前の「右キーが押されたとき、x座標を変える」などの移動処理が残っていないか見ます。新旧の処理が両方動くと、この例とは違う移動量になります。
斜めから横へ戻っても遅い場合は、「今回の移動量を基本の速さにする」が「ずっと」の内側にあるか確認してください。毎回いったん基本値へ戻し、その回が斜めなら補正する順番です。
キーを離しても動く場合は、横入力と縦入力を0にする処理が、繰り返しの先頭にあるかを見ます。前の回の入力を残さず、その時点で押しているキーから作り直します。
なお、端に触れた後の動きや壁との接触は、この確認には含めません。まず何もない場所で方向ごとの移動量をそろえ、その後に作品のほかの仕組みへ組み込みます。
よくある質問(FAQ)
斜めを速いままにしてはいけませんか?
いけないわけではありません。斜めに進むことを有利な操作として残したいなら、それも作品のルールです。どの方向でも同じ速さで移動させたい場合に、今回の補正を使ってください。
横と縦を半分ずつにすれば、同じ速さになりますか?
半分ずつでは、斜めが遅くなります。基本の速さが4なら、横2・縦2の直線距離は約2.83です。横だけで4進む場合にそろえるには、それぞれを2の平方根で割ります。
基本の速さを変えたら、斜めも設定し直しますか?
この組み方なら、変えるのは「基本の速さ」です。「今回の移動量」をそこから計算しているため、斜め用の数値を別に手入力する必要はありません。
ジャンプする横スクロールゲームにも、そのまま使えますか?
そのまま当てはめることは勧めません。今回は、上下左右へ自由に進む見下ろし型の移動が対象です。ジャンプや重力による縦移動は、プレイヤーが上キーで進む操作とは役割が違うため、分けて設計します。
この方法で、別のパソコンでも1秒あたりの速さが一致しますか?
そこまでは保証しません。ここでそろえるのは、同じ繰り返しの中での縦横と斜めの移動距離です。経過時間を使った速さの管理は、この方法とは別の設計になります。
作品の「こう動かしたい」を、学びの出発点に
斜めの速さをそろえる作業は、単に数値を小さくすることではありません。「入力を調べる処理」と「実際に動かす処理」を分けると、どこで移動量が決まるのかを追いやすくなります。
CotoMiraiでは、年齢・興味・理解度に合わせた個別指導で、プログラミングやロボット、デジタルものづくりを扱っています。今回のような「自分のキャラクターをこう動かしたい」という希望も、取り組みたい内容を伝える具体例になります。
公式の入会案内では、年中以上のお子さまは無料体験から案内しています。希望する教材や内容、家庭の途中作品を扱えるかは、申し込み時に確認してください。
参考にした情報
関連する記事
お子さまに合う学び方診断
正解・不正解を決める診断ではありません。今の様子から、取り組みやすい学び方の入口をご案内します。