| 敵と自機弾の当り判定 | ||||
さて、問題の当り判定です。これがしっかりしていないと、ゲームとして成立しませんね。 ここでのミソは2重ループを使ってることです。つまり、敵一機一機について、弾一個づつ順番に当り判定をしているわけです。このサンプルでは敵が最大50(emax=50)で、自機弾が最大3(wmax=3)なので、このルーチンでは合計50x3=150回の当り判定ループを行っていることになります。そして、その2重ループを行う上で一番大切な処理が「 ent=cnt 」の部分です。
普通に1重のループであれば、「 cnt 」というシステム変数を使えば「何番目の要素番号」というのは簡単に処理できます(奮闘記10.配列変数を参照)。ところが、2重のループになった場合、内側のループではそのシステム変数が内側だけのものになってしまいます。つまり、外側のループが何回目のループ(要素番号何番か?)なのか?を記憶しておく変数を用意しなければ、内側のループでそれを使う事ができないのです。つまり、内側のループではentが敵、cntが自機弾の番号を意味しているわけです。 さて、問題の当り判定。これは座標の差(絶対値)によって判定します。その際敵機と自機弾の大きさの違いを考慮に入れて、計算式の中で調整を行っています。要は、中心座標の差(絶対値)を求めているわけです。敵機の大きさは50x50なので、中心座標は(ex+25、ey+25)になります。自機弾の大きさは25x50なので、だいたいの中心座標は(wx+12、wy+25)です。この差を求め、それが一定数以下ならばあたりという判定を行っているわけです。 ![]() if (ddx<20)&(ddy<40) またしても半日で作った弊害が表面化してしまいました。まぁあんまり問題にはならないですが、皆さんがこういう処理を行うときは、こういった無駄な事はしないようにしましょう^^; ちなみに、この数値を大きくしたり小さくしたりする事によって、当り判定の範囲を大きくしたり小さくしたりする事ができます。ゲームの難易度に大きくかかわってくる部分ですね。 後は、当りだった場合にどう処理をするかだけです。このサンプルでは敵の固さという概念がありますのでそれを減らし(ef.ent--)、自機弾を消し(wf.cnt=0)ます。この自機弾を消す処理を行わないと、貫通するレーザーのできあがりです。また、ef.entから減らす値を武器によって変えれば、威力の違いという概念も導入できます。「Aeolianation」ではLimitedモードだけしか出てきませんが、自動標準レーザーと誘導弾の威力を著しく落とすために、この概念を導入しています。 後は、敵がまだ破壊できてない場合(ヒットした効果音と画像の表示)と、破壊した場合(爆発音と爆風の表示・得点のカウントと倍率表示の処理)の処理を行うだけです。このあたりの処理をどうするかはアイデア次第です。例えば爆風も、もっと飛び散るような派手なものにするんだったらそれなりの処理を行わなければなりませんし、例えば連続ヒットコンボのような概念を導入するのであれば、やはりもっと処理は複雑になってきます。ただ、基本は座標の差を求め、それが一定数以下の場合は当り、という部分です。
|