私が改良したシューティングゲーム

 最近の私は、時間があるとscratchというプログラミング言語で遊んでいます。以前の記事にも書いたのですが、私の上司がゲーム好きでして、話題づくりに何か簡単なゲームを作りたいと思ったからです。結局、scratchを選択して、2年前に作りっぱなしになっていたシューティングゲームを改良していました。その改良が、いい感じに落ち着いたので、報告の記事としてコレを書いています。

 念のため、そもそもscratchとは?というところを簡単に書いておきます。プログラミング言語には、基本とされるC言語から始まり、様々な種類があります。scratchはそのうちのひとつでして、アメリカの大学が開発した子ども用の言語です。普通、プログラミング言語は英語で構築されていますが、scratchは日本語で組むことができるし、文字だけでなく視覚的にも改良されているので、ブロックを組み合わせるだけでさくさくとプログラムを組むことができます。

 さて、私の2年前のシューティングゲーム。一応本の通りには完成しているのですが、痒い所に手が届かないシステムでした。私が改良した点は3点あります。

 第一に、当たり判定を調整すること。本の通りだと、自機が撃った球が敵にヒットした時、そのまま敵の体をすり抜けている間中ずっと当たり判定を出し続けます。つまり、1発当たっただけで5発くらい当たったことになってしまうのです。
 これについては、久しぶりに触ったこともあって、かなり苦労しました。本にはヒントとして「自機の球が敵に当たった瞬間に、自機の球を新しく作った別の球にすり替えることによって当たり判定を一つの球につき一発にできる」と書いてありましたが、これがうまくできず迷走しました。結局私はその方法ではなくて、「自機の球が敵に当たった時に信号を送る」「信号を受け取り、かつ、この球が敵に当たっていたらこの球を消す」という二段階システムにすることで解決しました。
 なぜわざわざ「敵に当たっていたら」という部分を作ったかというと、それがないと自機から発射中のほかの球まで空中で消えてしまうからです。プログラムとして美しいかどうかはともかく、とりあえず私のイメージ通りの動きを、この改良によって当たり判定については、するようになりました。

 第二に、制限時間を設定すること。本の通りだと、敵に20発当てるか自機に敵の球が当たることでゲームが終了しますが、制限時間があった方が盛り上がるかなと思いました。
 これについては、実はググりました。でもググったプログラムをそのまま再現すると、ゲームが起動しなくなりました。
 今回のゲームでは、起動ボタンを押してから数秒の間を使って、ゲームの簡単な説明と数字の処理(当たった回数をリセットしたりとか)をしています。それを無視して「起動ボタンを押したら制限時間のカウントを始める」と組んでしまったので、エラーが起きてしまいました。
 これは、もともと本のコードからあった「信号1を受け取った時」に起動タイミングを変えることですぐに解決しました。時間切れになった時に自機に「ゲームオーバー」と言わせることもちょっと苦労しましたが、ささっと組んで終了です。

 第三に、敵が球を撃つようにプログラムすること。本の通りでも敵は球を撃ちますが、あくまで敵に自機の球が当たった時だけ撃ち返すだけです。何度もテストプレイをしていると慣れてきて、ちょっとだるくなってきてしまいました。
 これについては、一度失敗しました。制限時間を利用して、制限時間の一桁目が0か5の時に球を撃つ、というコードにしようと思いました。だから「制限時間に5を含むとき、敵は球を撃つ」と組んでみたら、まあ、ダメでした。制限時間50秒台で弾幕になりました(笑)。
 失敗した方法をもっと頑張って組んでも良かったけれど、ここは切り替えて乱数を使うことにしました。乱数を裏で発生させて、1~5の乱数を1秒に1回判定し、5の時だけ球を撃つことにしたのです。プログラムそのものは割と簡単に組めました。ゲームとしては、乱数なのですごい撃って来る時もあれば、全然来ないときもあります。でもそれが楽しいし、乱数をもっと少なくしたり、秒数を短くしたりすることで難易度の調整は可能そうです。起動時にレベルを選択することとかもできたら素敵だなぁ。次の目標はそれかな!

 こんな感じで、なかなか楽しいシューティングゲームに生まれ変わっています。一応本のプログラムを元にしているので公開はしていませんが、いずれは問い合わせて、公開できるならしたいですね。上司との楽しい会話のネタになりそうです!

この記事が気に入ったらサポートをしてみませんか?