まよねーず工場

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/-- --:-- |スポンサー広告  

アクションゲームの考え方~床との判定~

現在アクションゲームの勉強中、
数学やプログラムの参考書などを目に通しながら試行錯誤しているNOWです

というわけで忘れないよう、
自分なりに考え方をまとめてみることにします。


<今回は地面との衝突判定についてのお話し>


とりあえずこんな図を作ってみます

アクションプログラミング~線と円の接触判定~


やたらといろんな文字がでてきて頭がパーンしそうですが、
ひとつずつ追っていけば大丈夫かと思われます。



まず、物体というのは今回は仮にプレイヤーということにしていますのでplという名前がついています。
プレイヤーの座標は( pl.x , pl.y )ということになります。


そして次に線の座標
線というのはようするに床です。

2Dアクションではこの線と円の衝突を判定していきます。

線の座標は開始点のx,yと終了点のx,yの二つからなりますので
( line.start.x , line.start.y )と( line.end.x , line.end.y )
の二つが存在することになります。



この物体の座標と線の開始点からなる線は
「ベクトルa」としています。


つまりベクトルa(aVectという名前にしておきます)は
物体の座標 - 線開始点の座標

aVect.x = pl.x - line.start.x
aVect.x = pl.y - line.start.y

から成ります。


次に床のベクトルを求めます。


線自体のベクトルを「ベクトルb」とします


ベクトルb(bVect)は
線の終了点 - 開始点で求めます

つまり


bVect.x = line.end.x - line.tart.x
bVect.y = line.end.y - line.start.y


でbベクトルを求められます。




aベクトルとbベクトルを求めることで
このベクトル間の内積(Dot)が求められます



内積は
Dot = ( aVect.x * bVect.x ) + ( aVect.y * bVect.y )
で求められるようです




そして次に線の長さ( bVectLength )を求めます



bVectLengthの長さは

( bVect.x * bVect.x ) + ( bVect.y * bVect.y )
で2乗の長さを求めることが可能、
これにルートをかけることで
sqrt( ( bVect.x * bVect.x ) + ( bVect.y * bVect.y ) )とすることで

本来の長さを求めることができますが、
今回は2乗の長さを求めてみます。



内積がこのベクトルの長さ2乗以上長さ以下のポジション内にいる場合、
「有効範囲内にいる」という判定ができます


つまり
if( Dot > bVectLength && Dot < bVectLength )が成立すれば

「少なくとも物体は線の範囲内にいるよ!

ということになるのです。


当然これだけでは当たり判定は成立しません。

結果論的には図にも書いたのですが、
線と物体との距離(distance)を求められれば当たり判定成立はもうすぐだったりするようです。

そのためにはaベクトルの長さに合わせてbベクトルが変化する必要があるらしく、


そのために単位ベクトル(bVectUnit)というのを求めてみます。
いわゆる長さ1のベクトルです。

まず正規の長さを求めます
Length = sqrt( ( bVect.x * bVect.x ) + ( bVect.y * bVect.y ) )
そして
bVectUnit.x = Length / bVect.x
bVectUnit.y = Length / bVect.y

といった具合に長さからベクトル座標で割ることで単位ベクトルを求めることができます。


こうして求めた単位ベクトル(bVect2)とaベクトルの内積(Dot2)を求めます。

この内積と単位ベクトルを計算するとaベクトルの長さに合わせて延長されたbベクトルが作れます

bVect.x = Dot2 * bVectUnit.x
bVect.y = Dot2 * bVectUnit.y

そしてこのbVect2に線の開始点の座標を足しますと
物体と線を結ぶ交点(Intersection)を求められるのです。



あとは物体の座標からIntersectionの座標を引くことで
ベクトルdistanceが求められます。



distance.x * distance.x + distance.y * distance.y < pl.range * pl.range

この式が成立したら当たり判定が成立となります。




という感じで当たり判定が完成、ただしまだ斜めの坂の計算がこれでは出来ないので
その辺もまたまとめてみようと思っています。


ではでは

スポンサーサイト

2011/04/09 20:10 |プログラムCOMMENT(0)TRACKBACK(0)  

コメント

コメントの投稿



管理者にだけ表示を許可する

 | BLOG TOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。