「30分で作ろう」シリーズ(5) 太陽ゲーム
3. 月を水星に進化させよう
月と月が衝突したら水星に進化するプログラムを作ります。
以下の2つに分けて、順番に作っていきましょう。
・衝突位置を特定する
・月が水星に進化する

月の衝突位置を特定する
「月-」オブジェクトに衝突位置を特定するプログラムを作ります。

始めに、「月-」を「月グループ」に設定します。今後作成される「月-」の分身もこの設定を引き継ぎ、月グループに属します。

「スタートボタンが押されたら」は「イベント」カテゴリにあります。
「[自分]を[月]グループに設定」ブロックは、「テクニック」カテゴリにあります。
次に、「月-」の分身が「月」グループ(他の「月-」の分身)と接触したときに実行される以下のようなプログラムを作成します。

「[自分]が[月]グループと接触したら」ブロックは、「イベント」カテゴリにあります。どの月と接触するか特定することはできないので、「月」グループに属するどの月でも接触したらプログラムが実行されるようにします。
[水星作成]の値を[1]にする」ブロックは、[X/Y]カテゴリにあります。「水星作成」は変数です。この変数の値が[1]になると水星が合成されます。合成のプログラムは後述します。
「[衝突位置]が瞬間移動 [自分]から見て X[0] Y[0] Z[0] 回転 X [✓] Y [✓] Z [✓]」ブロックは、「アクション」カテゴリにあります。月が他の月と接触したら、「衝突位置」オブジェクトを2つの月が接触した場所に瞬間的に移動させます。
最後に、接触した「相手」と「自分」を削除します。「[相手]を削除」、「[自分]を削除」ブロックは、「テクニック」カテゴリにあります。
「[衝突位置]が瞬間移動ブロックのX座標、Y座標の値は複数のブロックを組み合わせて作ります。

始めに、「演算」カテゴリの「[1] [+] [1]」ブロックの左側の[1]に、もう一つの「[1] [+] [1]」ブロックを挿入します。

以下のような形になります。

ここに、「アクション」カテゴリの「[相手]」の[座標] [X]」ブロックを挿入します。

最後に、「+」を「-」「÷」に、「1」を「2」に変更します。

演算の順番は同じブロック内の演算が優先されるので、(相手のX座標 - 自分のX座標)÷2となります。
「相手」は、衝突した相手を指します。
「相手のX座標-自分のX座標÷2」は、月の半径と同じ距離です。「衝突位置」のX座標は「自分」を基準としてから月の半径だけ離れた位置になります。

惑星が積み重なっていくと衝突する位置の高さも変わるため、Y座標も同様に作成します。
月が水星に進化する
月が合体して水星になるプログラムを「合体」オブジェクトに作ります。

「スタート」ボタンが押されたら、変数「水星作成」の値を常に確認し続け(「常にくり返す」)、「水星作成」の値が「1」だったら、「[水星-]の分身を作る」以降のプログラムを実行します。

「常にくり返す」ブロックは、「iF」カテゴリにあります。
「もし『[水星作成]の値 [=] [1]』なら実行する」のうち、「もし[~]なら実行する」ブロックは「iF」カテゴリに、「[~] [=] [~]」は「演算」カテゴリにあります。この条件は、「月-」オブジェクトに作成した以下のプログラムにより成立します。

「[水星-]の分身を作る [衝突位置]から見て X[0] Y[0] Z[0]」に」は「テクニック」カテゴリにあります。
「[インパクト(水)]を鳴らす」ブロックは音を再生する命令で、「効果」カテゴリにあります。
「[爆発(水)]を表示ブロック 位置[衝突位置]」はエフェクトを表示する命令で、「効果」カテゴリにあります。「衝突位置」オブジェクトの位置(月が衝突した位置)でエフェクトが再生されます。
月の衝突はいつ、どこで発生するかはわからないので、「衝突位置」オブジェクトが衝突箇所に瞬間移動し、その位置で新しい惑星が誕生したり、エフェクトが表示されるようにしています。
最後に「[水星作成]の値を[0]にする」ブロックで、変数「水星作成」の値を[0]に戻します。
これで月の衝突と水星の誕生が完成しました。プログラムを実行して、動作を確認してみましょう。

