演習7:シューティングゲーム

LEDアレイへの表示とボタンの操作については完璧に理解できているはずです。集大成として、みんな大好き、シューティングゲームを作ります。

全体の構造を作る

ゲームの骨格となる全体の構造を作ります。

LEDアレイの表示には Adafruit のライブラリを使いますが、直接その関数をコールするのは面倒なので、表示内容を制御するのに LED[5][5] という配列を使うことにしました。ゲームのメインルーチンではこの配列を操作して、updateDisplay() で表示します。変数 time にはプログラムが開始されてからの経過時間をミリ秒単位で持ちます。シリアル通信でデバッグするような状況もあると思われるので設定しておきます。メインの loop() は50ミリ秒周期で回して、そのたびに表示内容を更新する仕組みにしました。

課題1

LED[5][5] の初期値として入れてある四角が表示されることを確認してください。シリアルモニタを起動して、上記のプログラムで書き出している時間の経過を確認してください。プログラム全体の動作で分からないことがあれば Serial.print() または Serial.println() を使って確認してください。

敵を動かす

LEDの1行目(y=0の行)にLEDをひとつ点灯して左右に移動させましょう。これが「敵」です。さきほどのプログラムを次のように改変してください。

敵(つまり1行目で光っているLED)の場所と移動方向を覚えるための変数を定義します。メインの loop() の動作周期で移動させるのは速すぎるので、300ミリ秒毎に移動させることにしました。その制御に lasttime という変数を使っています。この関数 showTarget() をメイン loop() から呼ぶことを忘れないでください。

自分の位置を移動して、表示する

自分の位置(自分の飛行機、宇宙船 etc.)をLEDの5行目(y=4の行)にLEDをひとつ点灯して示し、Aボタン・Bボタンで左右に移動させます。これは演習6で作りましたので(回答例を参照)、必要なソースコードをいま作っているプログラムにコピペして合体させるだけです。プログラミングの練習のため、自分でやってみてください。

演習6ではLEDをオンするために loop() の中で

のように書きましたが、今回は配列 LED[5][5] を操作してLEDをオン・オフしますので、次のようにしましょう。

showMyPosition() は自分の位置のLEDを光らせる関数です。これを loop() の中からコールします。

課題2

ここまでできれば、LEDアレイの上部に敵機が左右に動いて、最下段には自機がA/Bボタンでコントロールできているはずです。もしできてなかったらデバッグしてください。

弾を撃つ

AボタンとBボタンが同時に押されたら弾を発射しましょう。

弾を撃つ関数です。my_positionから上方向に順にLEDを光らせます。光らせるタイミングはメインの loop() とは独立しているので LED[5][5] を操作するのではなく microbit.drawPixel() を直接コールしています。

AボタンとBボタンが同時押しは loop() の中でこのように検出できます。

課題3

以上のソースコードをまとめれば、シューティングゲームの基本部分は完成です。もし動作がおかしければデバッグして修正してください。

「とりあえず完成バージョン」はこちら

課題4

「とりあえず完成バージョン」を元にして、自分のゲームを作ってください。例えば、敵の動きがだんだん早くなる、敵が下に降りてくる、弾が命中したら火花を表示する、等々。

コメント