さて、前回は「レースゲーム」を題材にmicro:bitでゲームのプログラムを作ってみました。
これに気を良くしたので次のお題は「インベーダーゲーム」にしようと思います。
いよいよ第三弾となり当たり判定と得点を実装していきます。
おさらい
前回の記事までで宇宙船とインベーダーの動作を行うプログラムを作成しました。
当たり判定を実装していないので弾がインベーダーに当たっても何もならず、インベーダーが宇宙船に当たっても何もならない状態です。
そこで今回は弾がインベーダーに当たった時にインベーダーを削除&得点加算をし、インベーダーが宇宙船に当たった時にゲームオーバーとなるようにプログラムを作成していきます。
概要
・ゲーム画面は5×5のLEDを使って宇宙船の真上(宇宙船の真上とは?w)から見下ろしたイメージです。
・前方からインベーダーが横移動しながら下へ迫ってきます。
・インベーダーは宇宙船から発射した弾に当たると倒せます。
・インベーダーが一番下まで来るとゲームオーバーでそれまでに倒したインベーダーの数で勝負するゲームです。
ゲームオーバーを実装
インベーダーが宇宙船にぶつかるとゲームオーバーとなるようにします。
これはレースゲームのゲームオーバー条件と同じなので同じように実装します。
「ずっと」ブロックを新しく配置し、インベーダーと宇宙船のスプライトがぶつかった時にゲームオーバーになるようにブロックを配置します。
ここでエラーが発生しました。
宇宙船のスプライトは「最初から」のブロックで作成し、ゲームオーバーになるまでの間無くなる事は無いのですがインベーダーのスプライトは必ず存在しているわけではありません。
なので当たり判定ロジックはインベーダーのスプライトが存在する時のみ実行されるように存在判定が当たり判定前に必要になります。
これでインベーダーが宇宙船にぶつかるとゲームオーバーになるプログラムが出来ました。
実際に動かしてみて下さい。
インベーダーが宇宙船にぶつかるとゲームオーバー画面が表示されます。
|
|
インベーダー破壊を実装
宇宙船とインベーダーの当たり判定とゲームオーバーをプログラムしたので次は弾とインベーダーの当たり判定とインベーダーの破壊をプログラムします。
インベーダーは宇宙船が発射する弾に当たると破壊(スプライトの削除)するプログラムを作成します。
いままでの当たり判定と作り方は一緒で発射していないと弾の当たり判定を実現できないため発射の判定を行い弾とインベーダーが当たった時にインベーダーのスプライトを削除します。
インベーダーを削除した時には忘れず「インベーダー存在」変数を「0」(存在しない)にしておく必要があります。
また、ゲームオーバー時の点数を正しく表示させるために点数を1点増加させました。
難易度調整
ここまでで弾によってインベーダーを倒し、インベーダーに当たる事でゲームオーバーになるプログラムを作成できました。
とりあえずはゲームとなったのですが動きも単調でいつまでたってもゲームオーバーにはなりそうもないです。
そこで難易度を調整しようと移動速度を変数化して値を調整してみたのですがそれだけでは難易度を上げる事は難しかったです。
インベーダーも攻撃してくると難易度を上げやすいのですがやはり5×5のLEDでこれ以上スプライトを増やすとどれがどれだかわからなくなってきてこれ以上難易度を上げる事ができませんでした。
まとめ
これまでゲーム作成にてスプライトを何度か使ってきましたが断然プログラム作成に短い時間でできます。
スプライトの使い方も分かってきたと思うので自分なりのゲームを作ってみてはいかがでしょう。
コメント