前回の ブロック崩しを作ろう 2 のつづきです。
ブロック崩しは今回で完結です。
最後までがんばりましょう。
ところで、ほかのプログラミング言語でゲームを作ったことはありますか?
もしまだなら、いつか挑戦してみてください。
そのとききっと、「MakeCode Arcade はとても簡単だったんだな」と実感することでしょう。
ボールとブロックの当たりを入れよう
ブロックを並べたことで、「ブロック崩し」のゲーム画面になりましたね。
次はボールとブロックの当たりを入れます。
これで遊べるようになります。
当たり判定は、バーとボールのものをコピーします。
当たり判定のブロックを右クリックしてメニューを出し、複製しましょう。

タイプを Player から Enemy に変更します。

これで、ブロック(Enemy)とボール(ball)の当たり判定ができました。
それでは、ボールが跳ね返るか確認してみましょう。
あれ、ボールがブロックをすり抜けて、上まで来てしまいました。

これは跳ね返す計算で絶対値を使っているため、必ず上に跳ね返っています。
計算式から絶対値をとり除きます。

確認しましょう。下向きに跳ね返るようになりました。

ブロックを消そう
ボールが当たったブロックを消します。
スプライトを破棄する命令を使います。

ボールとブロックの当たり判定の中に、スプライト破棄の命令を入れます。
変数は sprite に変更しましょう。

遊んでみましょう。
ボールはブロックで跳ね返り、同時にブロックが消えます。

ブロックが一度にたくさん消えるときがあります。
シンプルな当たり判定と跳ね返りの計算をしているためです。
初心者のうちはこれでもいいかなと思います。ゲーム作りに慣れてきたら、厳密な当たり判定や跳ね返りに挑戦してみてください。
スコアを入れよう
ゲームらしくスコアを入れます。
ブロックを消すタイミングでスコアに得点を入れます。
情報 の スコアを 1 だけ増やす を使います。

画面の右上にスコアが表示されます。
すべてのブロックを消すと 24 点になります。

すべて消したら?
ブロックをすべて消したら、どうしますか?
一般的には次のブロックを並べますが、ここではシンプルにゲームオーバーとすることにします。
全消しを判定する方法はいくつかありますが、今回は分かりやすい情報を利用します。
それは「スコア」です。全消し時のスコアが 24 点になることを利用しましょう。
情報 の スコアが 100 になった時 をドラッグします。

何もないところに配置して数を 24 に変更します。

ゲーム の 勝ち でゲームを終了する をドラッグします。

スコアが 24 になった時 の中に入れます。
これでスコアが 24 点になったとき勝ち演出のゲームオーバーになります。

ゲームオーバーのバグ
オールクリアによるゲームオーバー処理が完成しました。
たくさん遊んでみてください。
──しかし、バグ(不具合)が発生しました。
よく見ると、最後のブロックが消えていません。

何が起こったのでしょうか?
簡単に言えば、ブロックを消す処理の前にゲームオーバー処理が始まってしまったのです。
もう少し専門的に言うと、計算や判定、イベント処理などは描画処理よりも前に行われるため、ブロックを消す描画処理よりも、スコアが24点になったことによるイベント処理が優先されてしまったのです。
要はゲームオーバー処理が早すぎたので「待ち」を入れます。
ループ の 一時停止 100 ms をドラッグします。

ゲームを終了する の上に入れます。
100 ms とは 0.1 秒のことです。体感では一瞬ですね。

これで対処は終了です。
すべてのブロックが消えてゲームオーバーになることを確認してください。
もう一つのゲームオーバー
いよいよ大詰めです。
ボールを打ち逃したときのゲームオーバー処理を作りましょう。
ちなみに、この処理を最後にした理由は、これまで必要なかったからです。
先に入れてしまうと、テストプレイのたびにゲームオーバーになってしまい、作業の邪魔になりますよね。
ゲーム の ゲームが更新された時 をドラッグします。
何もないところに配置しましょう。

ボールが画面下まで到達したかどうかを調べるため、条件判断を使います。
論理 の もし真なら を ゲームが更新された時 の中に入れます。

論理 の 0 < 0 を条件式の中に入れます。

ボールの座標を取得します。
スプライト の mySprite x をドラッグします。
条件式の中に入れて ball y > 116 に変更してください。

ゲームオーバー処理を入れます。
今回は「負け」に切り替えて使います。

ボールが画面下まで落ちてゲームオーバーになることを確認しましょう。

調整しよう
プログラミングは完了しました。
しかし、このまま終わりにしてはいけません。
ゲームとしての品質を高める努力をしましょう。
まず気になったのは、プレイヤーの初期位置です。
ボールがいきなり動き出して、何もしなければ即ゲームオーバーになってしまうのは、良くないと思います。
そこで、バーの初期位置を変更します。x座標を 120 に設定しましょう。

それでも、やはりプログラムを起動してすぐにボールが動き出すのは、プレイヤーにやさしくありません。
ここは、ボタンを押してゲームを開始する流れにしましょう。
ゲーム の タイトルを表示する を 最初だけ の
最後に入れます。
「Aボタンでスタート」のメッセージに変更します。

起動後にメッセージを表示して処理が止まります。
これでプレイヤーの好きなタイミングで始められます。

しばらく遊んでみると、簡単すぎてつまらないと感じました。
このままでは作業をしているだけという感覚になりやすいです。
簡単な対処法として、バーの移動速度を遅くしてみます。
速度 vx を 55 に変更しましょう。

遊んでみてください。
ボールとバーの速度がこのバランスならば、ときどき先読みしてバーを移動させないと追いつけない場面が発生します。
少し難しすぎるかもしれませんね。
遊ぶ人に合わせてバーの速度を少し速くするのもいいと思います。
アクション性の強いゲームは、調整が難しいものです。
でも、ひとまずこれで完成としましょう。
お疲れさまでした。