「30分で作ろう」シリーズ(5) 太陽ゲーム
2. 月を落としてみよう
このラボでは月が落下するプログラムを以下の3段階に分けて作っていきます。
・ゲーム開始後に月を限度線(枠の上部の赤い枠)に出現させる
・クリックした位置に指示線(垂直の緑色の線)を移動する
・指示線の位置に月を落とす

月を限度線に出現させる
ゲーム開始直後に、最初の月を出現させます。
「開始位置」オブジェクトに以下のようなプログラムを作成します。


スタートボタンが押されたら、月の分身が「開始位置」オブジェクトがある場所に作成されます。
「開始位置」オブジェクトは限度線上の中央にありますが、大きさを「0」にしているため見えません。
「スタートボタンが押されたら」ブロックは、「イベント」カテゴリにあります。
「[月]の分身を作る [開始]から見て X[0] Y[0] Z[0]に」ブロックは、「テクニック」ブロックにあります。
・[月]の分身を作る:[ ]内には、その分身を作成したいオブジェクトを指定します。(「月」は画面には映らない位置に置かれています。)
・[開始位置]から見て X[0] Y[0] Z[0]に:基準となるオブジェクトからの距離をX, Y, Zで指定します。全て0なので、基準となるオブジェクトと同じ位置となります。
分身について
“分身”とは、オリジナルのオブジェクトからコピー(クローン)を作る機能です。プログラム実行中に指定のタイミングで指定の位置に作成でき、作成された分身にプログラムすることができます。
このゲームでは、たくさんの月が出現しますが、出現する数は決まっていません。そこで、「月」オブジェクトを1つだけ追加しその分身を作成することで、たくさんの月をプログラム実行中に出現させることができるようになります。
クリックした位置に指示線を移動する
次に、クリックした位置に指示線(緑色の線)が移動するプログラムを作成します。
「指示線」に図のようなプログラムを作ります。


「画面が[左ボタン]で[タップされたら] 接触判定[on] 接触対象[ステージ範囲]」ブロックは「イベント」カテゴリにあります。接触対象である「ステージ範囲」オブジェクトがマウスの左ボタンでクリックされた時に実行されます。
・[左ボタン]:マウスの左ボタン
・[タップされたら]:判定のタイミング
・[接触判定 on]:[接触対象]をタップ(マウスクリック)した場合のみ実行します。
・[接触対象 ステージ範囲]:接触対象を指定します。
「[指示線]が直線移動 X[0] Y[0] Z[0] [速度|秒] [0]」ブロックは「アクション」カテゴリ―にあります。このブロックにより指示線がタップ位置に移動します。
・[X] :指示線の移動先のX座標。クリックした位置を[ステージ範囲]の座標に変換し、取得します。「タップ座標 [X] 変換[ステージ範囲]」ブロックは、「イベント」カテゴリにあります。
・[Y] [Z]:指示線の移動先のY座標、Z座標。指示線の移動はX座標(左右)のみで、Y座標(上下)とZ座標(前後)は移動しないため、自分(指示線)の現在の座標を指定します。「[自分]の[座標][Y]」ブロック、「[自分]の[座標][Z]」ブロックは、「アクション」カテゴリにあります。(移動がないということで[0]とすると、指示線の原点は指示線の中央にあるため、指示線の下半分が地面に隠れる形で表示されてしまいます。)
プログラムを実行して、指示線がクリックした位置に横移動するか確認してみましょう。


指示線の位置に月を落とす
指示線の位置に月を落下させるプログラムを「開始位置」オブジェクトに作成します。

最終的に図のようなプログラムを作ります。

ただし、現時点では、「マクロ [タップ処理] [要素1]」や、「惑星を落とす [要素1]」というブロックは存在しません。これらは“マクロ”と呼ばれる新しい命令で、自分で作る必要があります。
マクロについて
“マクロ”とは、複数の命令を組み合わせて作った新しい命令です。マクロの中で実際に処理する内容を定めることを“定義する”と言います。プログラムエディタ画面下部の「マ」ボタンを押すと、このプログラムで使用されているマクロと、それが定義されているオブジェクトの一覧が表示されます。


それでは、マクロ命令「タップ処理」を作成しましょう。
オブジェクトリストで「開始位置」オブジェクトを選択し、「マクロ」カテゴリから、「マクロ [マクロ名] [要素1]」をプログラムエリアにドラッグ&ドロップします。

マクロ名に、「タップ処理」と入力します。マクロ名は自由に設定できます。

マクロ名を設定すると、「マクロ」カテゴリに「タップ処理」という新しいブロックが作成されます。このブロックで、画面をクリックした位置を取得することができます。

「指示線」オブジェクトを選択します。

先に作成したプログラムの最後に、「タップ処理 [0]」ブロックを追加します。

[0]の部分に、「イベント」カテゴリの「タップ処理[X] 変換[自分]」ブロックを挿入します。

「変換」の選択肢を「ステージ範囲」とします。これにより、画面上のタップ位置を「ステージ範囲」オブジェクトのX座標に変換した値を取得することができます。

以下のようなプログラムになります。

これにより、以下のことができるようになります。
・画面をマウスの左ボタンでタップ(クリック)すると指示線がタップ位置に0秒で(瞬時に)移動する
・移動は左右方向のみで、上下や前後の移動はない(指示線のX座標のみ変更)
・「タップ処理」マクロが、タップ位置を取得する
次に、「開始位置」オブジェクトに図のようなプログラムを作成します。


ここでもマクロを使用します。「マクロ」カテゴリの「マクロ [マクロ名] [要素1]」ブロックを使い、マクロ名を「惑星を落とす」にします。

このブロックに、「[月-]の分身を作る [開始位置]から見て X[要素1] Y[0] Z[0]に」ブロック、及び、「[月]の分身を全て削除」ブロックを組み合わせます。これらのブロックは「テクニック」カテゴリにあります。

・[月-]:「月」ではなく「月-」の分身を作成します。「月」は出現する月、「月-」落下する月です。
・[X]:「要素1」は、「惑星を落とす」マクロの「要素1」をドラッグ&ドロップします。
・[月]:「月-」が分身で作成されたら、「月」の分身を削除します。
続いて下図のプログラムを作ります。「惑星を落とす [0]」ブロックの[0]に、「マクロ [タップ処理] [要素1]」の「要素1」ラベルをドラッグ&ドロップします。
「要素1」は画面をタップした位置です。タップした位置に惑星が落下します。


「[バウンド]を鳴らす」は、タップした時にサウンドを再生する演出です。このブロックは、「効果」カテゴリにあります。アイコンをクリックすると、サウンドの一覧が開き、サウンドを選択することができます。

「[0.25]秒待つ」は、間隔を調整しています。ブロックは「iF」カテゴリにあります。
これで、月の出現から落下までができました。実行して動作を確かめてみましょう。

