見出し画像

一分間スクラッチ講座|スクロール処理⑤スプライトの幅を自動で取得する方法

スクロール処理でブロックを正しく表示・非表示する準備

前回までの記事では、スクロールに合わせてブロックを移動させたり、クローンで複数のブロックを作ったり、画面端に来たタイミングで表示・非表示を切り替える仕組みを作ってきました。

ただ、ここでひとつ問題があります。

ブロックの種類が増えてくると、ブロックごとに違う横幅を登録するのが大変、ということです。

同じ足場でも、長いブロック、短いブロック、見た目の違うブロックなどを使う場合、それぞれの幅を考えながら表示・非表示を管理する必要があります。

そこで今回は、スクラッチのスプライトの幅を、プログラムで自動的に取得する方法を作っていきます。

こちらは Youtube ショート動画、ファイブボックス一分間スクラッチ講座でまとめた内容です。
もしお時間がありましたら、ご一緒にご覧ください。


1. スプライトの幅をどうやって調べるか

まずは、スプライトの幅を取得する考え方です。

スクラッチのステージでは、x座標の右端はだいたい 240 付近です。
今回はこの仕組みを使います。
スプライトをいったん画面の中心、つまり
x座標:0 y座標:0 
に配置します。

x座標:0 y座標:0 にする

このとき、スプライトが画面の端に触れていない状態にしておきます。
そこから、スプライトを右方向へ少しずつ移動させます。

x座標を 1 ずつ変える

そして、スプライトが右端に触れるまで移動させます。

端に触れるまで繰返し、x座標を1ずつ変える

2. 右端に触れた位置から幅を計算する

スプライトが右端に触れたとき、スプライトの中心は画面の右端より少し左にあります。

たとえば、端に触れたときのx座標が 200 だったとします。
スクラッチの右端を 240 として考えると、240の時に1回だ「x座標を1ずつ変える」が動いてしまうので、この時のブロックの右端のx座標は 241 になります。

241 - x座標

で、スプライトの半分の幅を求めることができます。
今回の例なら、

241 - 200 = 41

この 41 が、スプライトの中心から右端までの長さです。

つまり、スプライトの半分の幅です。

スプライト全体の幅にするには、これを2倍します。

(241 - x座標) × 2

これで、スプライトの幅を求めることができます。


3. 幅を取得する専用ブロックを作る

この処理は、コスチュームごとに何度も実行します。

普通に実行すると、スプライトが画面上を動いている様子が見えてしまいます。
そこで、ブロック定義を使います。

「ブロックを作る」から、たとえば「はば取得」という名前のブロックを作ります。

このとき、必ず「画面を再描画せずに実行する」にチェックを入れておきます。
これにチェックを入れることで、処理を高速に実行でき、画面上でスプライトが移動しているように見えなくなります。


4. リスト「はば」を準備する

取得した幅は、あとでクローンを作るときに使いたいので、リストに保存しておきます。

今回は「はば」というリストを作ります。

このリストには、各コスチュームの幅を順番に入れていきます。
たとえば、

1番目のコスチュームの幅
2番目のコスチュームの幅
3番目のコスチュームの幅

というように、コスチューム番号とリストの番号が対応する形にしておきます。


5. ブロック定義の中身

作成する「はば取得」ブロックの流れは、次のようになります。

  1. リスト「はば」の中身をすべて削除します。
     →前に取得した幅が残っていると、データが重複してしまう。

  2. コスチュームを1番目にします。

  3. 以下の処理をくり返します。
    a, x座標とy座標を0にする
    b, 端に触れるまで、x座標を1ずつ変える
    c, (241 - x座標) × 2 をリスト「はば」に追加する
    d, 次のコスチュームにする
    e, 1番目のコスチュームに戻ったら処理を止める

このようにすると、すべてのコスチュームの幅を順番に取得できます。


6. クローンを作る前に呼び出す

作成した「はば取得」ブロックは、クローンを作る前に呼び出します。
流れとしては、次のようになります。

緑の旗が押されたとき
隠す
はば取得
クローンを作る
クローンを作る
クローンを作る

先に幅を取得しておくことで、クローンを作ったあとに、それぞれのブロックが自分の幅を使って表示・非表示の判定を行えるようになります。


7. 今回のポイント

今回は、スプライトの幅を自動で取得する仕組みを作りました。

ポイントは次の3つです。

端に触れるまで移動して、x座標を調べる
(241 - x座標) × 2 で幅を求める
取得した幅をリストに保存する

この仕組みを使うと、ブロックの種類が増えても、ひとつひとつ幅を手入力する必要がなくなります。

スクロールゲームでは、足場やブロックの種類が増えていくことが多いので、自動で幅を取得できるようにしておくと、あとから管理がとても楽になります。

次回は、このリストに保存した幅を使って、クローンごとの表示・非表示をより正確に管理していきます。


ファイブボックス一分間スクラッチ講座 の記事はこちらでまとめてあります。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!