| 敵弾と自機の当り判定 | ||||||
続いて、敵弾と自機の当り判定です。基本は自機弾と敵機の当り判定と全く同じです。二重ループを使わない分、こっちの方が簡単かもしれません。ポイントは同じく、座標差(絶対値)を求め、その差によって判定するというところです。
これも計算式に無駄がありますね。自機弾と敵機の当り判定と全く同じです。絶対値を求めてるのだから、ゼロ以下になる事はありえませんね。こんな感じで充分です。 if (dx<10)&(dy<10) 自機と敵弾が当ったときの処理でちょっと変わってるのが、ダメージを受けたらその瞬間に敵弾が全て消えるという部分です。これによって、ゲーム難易度を落としています。非常に短い記述でこういうことが簡単にできるのです。例えば敵弾を全て消すフラッシュボムのようなものにも使えますね。 ダメージを受けたときの処理でもう一つのポイントが、画面を赤くフラッシュさせる処理です。これは、メインルーチンの部分で画面クリアをする色をダメージを受けたフレームだけ変更する事によって実現しています。メインルーチンのこの部分です。
これによって、普段は(color 0,0,0)で画面更新を、ダメージを受けたときは(color 128,0,0)で画面更新を行うようになります。 もう一つ、画面効果を行わなかったので気づかない人も多いかと思うのですが、カスリボーナスの処理を行っています。これも当り判定の応用で、一定範囲以下であれば得点を加算する、という処理だけをしています。例えば「Distance」の場合、カスったら火花のようなものが飛ぶようになってるので、カスリボーナスの存在にも気づかれやすいです。が、このサンプルではあえてやらなかったので、実装してても気づいてもらえなかったのではないでしょうか?プログラムの構造のところでも話をしましたが、プログラムの流れは
こういった形になっています。「入力」→「判定」部分は基本になってくるので、それほど違いを持たせることはできませんが、「表示(出力)」部分に関しては、力いっぱい凝ることもできますし、シンプルにしちゃうこともできます。あまり凝りすぎると処理速度の問題なんかも出てきてしまいますが、せっかく実装している判定をユーザーに分かってもらえないというのも悲しいものです。サンプルの場合、わざと(面倒だったからじゃないです^^;)得点にだけ反映させてます。が、こういう小さな部分に凝る事で、ゲーム自体の面白みが増す事もあるということを覚えておきましょう。
|