ゴールキーパーを動かして、迫りくるシュートからゴールを守るScratchゲームです。キーパー、キッカー、ボールの動作をステートマシンで制御します。キーパーとボールの当たり判定、ジャンプ動作、効果音をタイミング良く鳴らす方法などについて解説します。
MakeyMakey Great Save!
Scratchのホームページで公開しています。低学年の子供でもコードが読めるように、変数名などはひらがなとカタカナにしました。ぜひ、リミックスしてみて下さい。
ボールを蹴る人(キッカー)
メインループ
メインとなるコードは下記です。コードが長くなるため、「しょきか」「ドリブル」「シュート」のブロックを作りました。ゲームは「どれかのキーがおされたまでまつ」が実行されてから始まります。シュートは10本勝負としたいので、「10かいくりかえす」のループを使用します。「ドリブル」と「シュート」が終わると、ボールが飛んでいって、ゴールするかキーパーにセーブされるまで、キッカーの動作は止めておく必要があります。「ステート=3」はゴールした状態、 「ステート=4」はセーブした状態 を表しますので、どちらかのステートになるまで待ちます。もし、セーブした場合は、スコアを1増やします。
シュートを10本蹴り終わると、ゲームは終了なので、「おわるまでReferee Whilstleのおとをならす」で笛を鳴らします。「どれかのキーがおされたではないまでまつ」とすることで、キーを押しっぱなしにした状態で、誤ってゲームを再開してしまうことを防いでいます。
初期化・ドリブル・シュート
「しょきか」ブロックで変数や座標の初期値を設定します。「ドリブル」ブロックは、ステートを1にします。ドリブルをスタートするx座標の位置を、「-240から240までのらんすうにする」で取得します。また、シュートする位置もランダムにしたいので、同様のコードで書きます。
「ドリブル」ブロックについて説明します。キッカーのスプライトの向きは、ドリブルする方向と合わせたいので、ドリブルを開始するスタート位置のX座標とシュートする位置のX座標を比較して、スプライトの向きを左にするか右にするかを判断しています。そして、1~2秒でシュート位置まで移動します。
「シュートブロック」のステートは2にします。このとき、「ステートが1から2にへんかをおくる」というメッセージを使用します。ステートの切り替わり時のみに動作させたい処理があるため、このような書き方をしています。コスチュームはシュート動作のものにして、「ステート=3またはステート=4までまつ」として、ボールがゴールするかキーパーにセーブされるまで待ちます。
効果音
キッカーの座標を他のスプライトで使用したいため、「X-ひと」と「Y-ひと」の変数に、ずっと代入し続けます。「ステートが1から2にへんかをうけとったとき」というのは、ドリブルからシュートに変わったときです。このときにボールを蹴る音(Tennis Hitで代用)を鳴らします。同様に、「ステートが2から3にへんかをうけとったとき」というのは、シュートボールがゴールしたときです。このときに、ゴールの歓声の音を鳴らします。ステートが2から4にへんかをうけとったとき」というのは、シュートボールがキーパーがセーブしたときです。このときに、ボールを弾く音(Basketball Bounceで代用)を鳴らします。
アニメーション
コスチュームの動作に関するコードは下記のとおりです。ステートごとに「もし~なら」のコードで条件分岐しています。ステート0はゲーム開始前なので、隠します。ステート1はドリブル状態なので、走っているアニメーションにしたいため、「ben-a」と「ben-a2」を0.1秒ごとに交互に切り替えるようにしています。「コスチュームのばんごう=1」というのは、「ben-a」のコスチュームなので、その場合は「ben-a2」になります。「ben-a2」 のコスチューム番号は2なので、次のループでは「ben-a」が選択されます。ステート3はゴールしたとき、ステート4はキーパーがセーブしたときなので、それぞれことなるコスチュームになるように記述しています。
ボール
アニメーション(表示・非表示・回転)
キッカーと同様に、変数X-ボールとY-ボールに各座標を代入します。コスチュームは、ゲーム開始前とキーパーがセーブしたときは非表示にし、ドリブルとシュートとゴールのときは表示させます。シュートボール(ステート2)に回転アニメーションをつけたいので、0.01秒ごとに15度回します。キッカーのシュート位置が左なら右回転、右なら左回転とします。
メインループ(移動)
ボールの移動に関するコードについて説明します。ステート1(ドリブルしている状態)では、キッカーと同じ動きをさせます。全く同じ座標だとボールが地面から浮いたように見えてしまうので少し調整して、「xざひょうをX-ひと - 0, y座標をY-ひと - 20にする」とします。
ステート2は、シュートをしてボールがゴールに向かって移動している状態です。シュートする方向は毎回ランダムにしたいため、ボールのもくてききのx座標とy座標を乱数生成します。また、ボールのスピードも乱数生成します。そして、「ボールのスピードびょうでxざひょうをX-ボールのもくてきちに、yざひょうをY-ぼーるのもくてきちにかえる」でシュートボールを移動させます。その後は、ステートが3または4になるまで待ちます。
「フラグ_ボールのもくてきち」は、もくてきち座標の乱数生成が完了したら1にします。まだの場合は0にします。この変数は、ボールの影のスプライトで使用します。
ボールの影
アニメーション(表示・非表示)
ボールの影のスプライトを使うことで、ボールが浮いているように見せることが出来ます。各ステートの「かくす」と「ひょうじする」は、ボールのスプライトと同じですが、さいはいめんでひょうじする設定にします。
ボールの影の座標はキーパーのスプライトで当たり判定で使用するため、変数「X-かげ」と「Y-かげ」に代入します。
メインループ(移動)
ボールの影の移動について説明します。ステート1はドリブル状態なので、ボールの座標に追随させます。ボールの影はボールの下側に表示させたいので、、座標を少しずらして調整します。
ステート2はシュート状態です。X座標の移動先は、ボールと同じため「x-ぼーるのもくてきち」となります。-9は中心座標がずれているため調整しているだけです。y座標の移動先は、ゴールラインなので、-23に設定します。移動先までにかかる秒数はボールと同じ値にする必要があるため、変数「ボールのスピード」を使用します。ステートが3または4になるまで待つことで、このブロックが連続実行されることを防いでいます。
「フラグ_ボールのもくてきち=1までまつ」は、キッカーのコードで「ボールのスピード」と「X-ボールのもくてきち」を乱数生成で設定完了することを待っていることを意味しています。
ゴールキーパー
メインループ(移動)
ゴールキーパーの動作について説明します。ゴールキーパーはゴールライン上に沿って、x軸方向(横方向)の移動とジャンプができるようにします。ゴールラインのy座標は-12なので、ステート0の座標は「xざひょうを0,yざひょうを-12にする」とします。
ゴールキーパーがボールを止めることが出来たかどうかの判定は、ボールの色とボールの影の座標を使用します。ボールの影のY座標が-40~-24の範囲にあれば、ボールとキーパーがY座標上で重なってる状態です。この状態で、キーパーがボールの灰色部分に触れた場合、キーパーがシュートボールを阻止ししたと判断します。このときのステートは3なので、「ステートを4にする」とします。また、「ステートが2から4にへんか」のメッセージも送ります。
ゴールキーパーがボールを止めることが出来なかった場合の判定は、ボールの影のY座標を使用します。ゴールラインよりも ボールの影のY座標 が大きくなった場合にゴールと判断すればいいので、「Y-かげ > -24」で判断します。ステートは3に変化させてメッセージを送ります。
ジャンプ動作については、ブロック定義をしています。
ジャンプ動作
ジャンプをする場合、重力を表現する必要があります。ジャンプボタンを押したときは、変数ジャンプは10となります(後述)。そのとき、以下のコードのとおり、Y座標の移動は10となります。次のループでは重力により移動量を10よりも小さくする必要があるので、「ジャンプを-1ずつかえる」とします。すてわち、Y座標の移動は10→9 →8 →・・・ →1 →0 →-1 →・・・となります。このままだと、Y座標の移動量がマイナス側にどんどん増えていってしまいます。これを防ぐために、ジャンプしたときのY座標は-12なので、Y座標が-12よりも小さくなった場合、Y座標を-12にもどして、変数ジャンプも0にもどします。通常はジャンプ動作のブロックを実行する必要はないので、このブロックを実行するときの条件として、「ジャンプ=0ではない」または「-12 < yざひょう」を入れています。
操作方法
ゴールキーパーの操作は、矢印キーで行います。MakeyMakeyでも動かしたいため、MakeyMakeyのブロックを使用しています。
右矢印キーで右側に5歩動かし、コスチュームを変更します。左矢印キーも同様です。コスチュームを変更することで、歩いているようなアニメーションになります。ジャンプは 「上矢印が押されたとき」と「左矢印キーと右矢印キーが同時に押されたとき」の2パターン用意しました。キーが押されたときは、ジャンプを10にしますが、それだけだとキーを押し続けた場合にキーパーが上昇し続けてしまうので、「ジャンプを10にする」を実行する条件として、キーパーが地上にいる条件「yざひょう=-12」を入れます。
その他
スタート画面、Goal・GreatSaveの文字、ボールがキーパーにぶつかった際の画像などのコードは下記の通りです。ここまで読んでいただいた方には、コードの説明は不要かと思います。
コメントを残す