« [解剖記]敵の生成と移動アルゴリズム3 | トップページ | [解剖記]敵弾の生成と移動 »

[解剖記]敵と自機弾の当り判定

さて、問題の当り判定です。これがしっかりしていないと、ゲームとして成立しませんね。

ここでのミソは2重ループを 使ってることです。つまり、敵一機一機について、弾一個づつ順番に当り判定をしているわけです。このサンプルでは敵が最大50(emax=50)で、自機 弾が最大3(wmax=3)なので、このルーチンでは合計50x3=150回の当り判定ループを行っていることになります。そして、その2重ループを行う 上で一番大切な処理が「 ent=cnt 」の部分です。


;■ 敵移動
*enemymove
repeat emax
et.cnt++
if ef.cnt<1 : continue
ent=cnt
repeat wmax
if wf.cnt<1 : continue
ddx=(ex.ent+25)-(wx.cnt+12)
if ddx<0 : ddx=-ddx
ddy=(ey.ent+25)-(wy.cnt+25)
if ddy<0 : ddy=-ddy
if (ddx>=0)&(ddx<20)&(ddy>=0)&(ddy<40) {
ef.ent-- : wf.cnt=0
if ef.ent>0 {
pos wx.cnt,wy.cnt
gcopy 2,175,25,25,25
snd 4
score++
}
else {
pos ex.
ent,ey.ent
gcopy 2,200,0,50,50
snd 2
gosub *messageborn
}
}
loop
if en.cnt=1 : gosub *enemy1
if en.cnt=2 : gosub *enemy2
if en.cnt=3 : gosub *enemy3
loop
return

普通に1重のループであれば、「 cnt 」というシステム変数を使えば「何番目の要素番号」というのは簡単に処理できます(奮闘記10.配列変数を参照)。ところが、2重のループになった場合、内側のループではそのシステム変数が内側だけのものになってしまいます。つまり、外側のループが何回目の ループ(要素番号何番か?)なのか?を記憶しておく変数を用意しなければ、内側のループでそれを使う事ができないのです。つまり、内側のループではent が敵、cntが自機弾の番号を意味しているわけです。

さて、問題の当り判定。これは座標の差(絶対値)によって判定します。その際敵機と自機弾の大きさの違いを考慮に入れて、計算式の中で調整を行っています。要は、中心座標の差(絶対値)を求めているわけです。敵機の大きさは50x50なので、中心座標は(ex+25、ey+25)になります。自機弾の大きさは25x50なので、だいたいの中心座標は(wx+12、wy+25)です。この差を求め、それが一定数以下ならばあたりという判定を行っているわけです。

ここで、お気づきの方もいるかと思いますが、この計算式には無駄があります。座標の差を絶対値で求めているので(ddx>=0)や(ddy>=0)という条件は不要です。無駄が無いようにするならばこの部分の計算式はこうなります。

if (ddx<20)&(ddy<40)

またしても半日で作った弊害が表面化してしまいました。まぁあんまり問題にはならないですが、皆さんがこういう処理を行うときは、こういった無駄な事はしないようにしましょう^^;

ちなみに、この数値を大きくしたり小さくしたりする事によって、当り判定の範囲を大きくしたり小さくしたりする事ができます。ゲームの難易度に大きくかかわってくる部分ですね。

後は、当りだった場合にどう処理をするかだけです。このサンプルでは敵の固さという概念がありますのでそれを減らし(ef.ent--)、自機弾を消し (wf.cnt=0)ます。この自機弾を消す処理を行わないと、貫通するレーザーのできあがりです。また、ef.entから減らす値を武器によって変えれ ば、威力の違いという概念も導入できます。「Aeolianation」ではLimitedモードだけしか出てきませんが、自動標準レーザーと誘導弾の威 力を著しく落とすために、この概念を導入しています。

後は、敵がまだ破壊できてない場合(ヒットした効果音と画像の表示)と、破壊した場合(爆発音と爆風の表示・得点のカウントと倍率表示の処理)の処理を行 うだけです。このあたりの処理をどうするかはアイデア次第です。例えば爆風も、もっと飛び散るような派手なものにするんだったらそれなりの処理を行わなけ ればなりませんし、例えば連続ヒットコンボのような概念を導入するのであれば、やはりもっと処理は複雑になってきます。ただ、基本は座標の差を求め、それ が一定数以下の場合は当り、という部分です。

« [解剖記]敵の生成と移動アルゴリズム3 | トップページ | [解剖記]敵弾の生成と移動 »

2.解剖記」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67538/57445610

この記事へのトラックバック一覧です: [解剖記]敵と自機弾の当り判定:

« [解剖記]敵の生成と移動アルゴリズム3 | トップページ | [解剖記]敵弾の生成と移動 »