ベクトルの内積を使うと傾いた矩形の当たり判定もできるそうです(しかも矩形に限らず何角形でもいい)。しかしちょっと難しそうです。ここでは、もっと単純明快な方法を書きたいと思います。
真ん中1ドットしか当たり判定がない自機が、傾いた壁や回転している敵と当たっているかどうか調べる、といった用途に使えると思います。
回転する前の矩形Aの左上隅の座標を(x1,y1)、中心座標を(cx1,cy1)とします。これを角度rだけ回転させた矩形をBとします。Bと点cとの当たり判定について考えます。これは、点cを反対方向に角度rだけ回転させた架空の点dと矩形Aとの当たり判定を行うのと同じことです。点cの座標を(x2,y2)、点dの座標を(tx2,ty2)とします。
次にtx2、ty2の求め方です。
- 点cと矩形の中心座標(cx1,cy1)との距離 l は√((x2-cx1)^2+(y2-cy1)^2)で求まります。矩形の幅をw、高さをhとするとcx1=x1+(w/2)、cy1=y1+(h/2)です。
- 矩形の中心座標を原点として見た場合の相対的な点c(c'とします)の座標を(x2',y2')、点d(d'とします)の座標を(tx2',ty2')とします。
x2'=x2-cx1
y2'=y2-cy1
tx2'=tx2-cx1
ty2'=ty2-cy1
- 軸に対する点c'の角度をr1、点d'の角度をr2とします。r1はアークタンジェントで求められます。
r1=atan y2'/x2'
r2=r1-r
- 点d'と原点(0,0)を結ぶ直線上で、原点から長さ1だけ離れた点のx座標はcos r2、y座標はsin r2で求まります。
- すると、
tx2'=l*cos r2
ty2'=l*sin r2
です。
- よって、(tx2,ty2)は以下の手順で求まります。
cx1=x1+(w/2)
cy1=y1+(h/2)
l=√((x2-cx1)^2+(y2-cy1)^2)
r2=(atan (y2-cy1)/(x2-cx1))-r
tx2=l*cos r2+cx1
ty2=l*sin r2+cy1
x1<=tx2かつtx2<=x1+w-1かつy1<=ty2かつty2<=y1+h-1の時当たりとなります。
自機の場合は真ん中1ドットにしか当たり判定がなくても構わないのですが、自機の弾とかだとそれではちょっと不正確ですね。そこで次は矩形同士の当たり判定について考えます。
- 弾(矩形C)の左上隅の座標を(x2,y2)、中心点の座標を(cx2,cy2)とします。矩形Cの幅をw2、高さをh2とすると、
cx2=x2+(w2/2)
cy2=y2+(h2/2)
です。
- 点(cx2,cy2)を先ほどと同じようにして角度rだけ回転移動した点(tcx2,tcy2)を中心とする矩形をDとします。こちらの矩形はまっすぐなままで傾けません。
- (tcx2,tcy2)は以下の手順で求まります(矩形Aの幅をw1、高さをh1とします)。
cx1=x1+(w1/2)
cy1=y1+(h1/2)
l=√((cx2-cx1)^2+(cy2-cy1)^2)
r2=(atan (cy2-cy1)/(cx2-cx1))-r
tcx2=l*cos r2+cx1
tcy2=l*sin r2+cy1
- 矩形Dの左上隅の座標を(tx2,ty2)とすると、
tx2=tcx2-(w2/2)
ty2=tcy2-(h2/2)
となります。
- あとは矩形AとDの当たり判定を行うだけです。
x1<=(tx2+w2-1)かつtx2<=(x1+w1-1)かつy1<=(ty2+h2-1)かつty2<=(y1+h1-1)の時当たりとなります。
この方法は、結局弾を敵と同じ角度だけ傾いた矩形に近似しているということです。ですから、用途によっては不十分に感じられるかと思います。
[サンプルプログラムをダウンロード] (HSP Ver2.61+hspext.dll+hmm.dll用)
[サンプルプログラムをダウンロード] (HSP Ver3用)
マウスで自機を動かし、左クリックで弾を撃ちます。自機と敵は点と矩形の当たり判定を、弾と敵は矩形同士の当たり判定を行います。
[目次へ]|[前へ]|[次へ]