現在アクションゲームを作っています。そこでボスの攻撃で薙ぎ払いビームを作っているのですが、
ビームとプレイヤーの当たり判定の考え方がわかりません。
プレイヤーは四角で判定を取るつもりです。
考え方やおすすめのサイトなどがあれば教えてください。
回転する短形と四角形の当たり判定について
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 回転する短形と四角形の当たり判定について
四角形と四角形の当たり判定を求めるとき、
四角形を2つの三角形だとして考え、
三角形と三角形の当たり判定を計算することで解決できます。
多角形はほぼすべて三角形がいくつか集まったものをみなせます。
https://www.google.com/search?q=%E4%B8% ... 4%E5%AE%9A
もし任意の四角形と円との当たり判定であれば、うちのサイトをご覧ください。
https://dixq.net/rp/34.html
四角形を2つの三角形だとして考え、
三角形と三角形の当たり判定を計算することで解決できます。
多角形はほぼすべて三角形がいくつか集まったものをみなせます。
https://www.google.com/search?q=%E4%B8% ... 4%E5%AE%9A
もし任意の四角形と円との当たり判定であれば、うちのサイトをご覧ください。
https://dixq.net/rp/34.html
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 回転する短形と四角形の当たり判定について
ところで「短形」って「矩形(くけい)」のことを意味していますか?
Re: 回転する短形と四角形の当たり判定について
分離直線が存在するか否かを調べればよいのでは.
(矩形同士なら4*4の16本の線について調べれば良さそうだけど,計算量が多いかな?)
(矩形同士なら4*4の16本の線について調べれば良さそうだけど,計算量が多いかな?)
Re: 回転する短形と四角形の当たり判定について
返信ありがとうございます。
短形じゃなくて矩形だったんですね。間違えて使ってました。
いくつか三角形の当たり判定のサイトを見てみましたが理解するのに結構時間がかかりそう…がんばります。
短形じゃなくて矩形だったんですね。間違えて使ってました。
いくつか三角形の当たり判定のサイトを見てみましたが理解するのに結構時間がかかりそう…がんばります。
Re: 回転する短形と四角形の当たり判定について
とりあえず点の座標を表すこんなのがあったとして…
矩形を4頂点の座標(Vec[4])で表すとき,当たり判定はこんな感じでどうでしょう?
//2次元ベクトル
struct Vec
{
Vec( double X=0, double Y=0 ) : X(X),Y(Y) {}
Vec operator+( const Vec &rhs ) const { return Vec( X+rhs.X, Y+rhs.Y ); }
Vec operator-( const Vec &rhs ) const { return Vec( X-rhs.X, Y-rhs.Y ); }
void operator*=( double s ){ X*=s; Y*=s; }
double Norm() const { return sqrt( X*X + Y*Y ); }
double X,Y;
};
//Z成分を0として3次元ベクトルとみなしたときの外積のZ成分
inline double CP( const Vec &lhs, const Vec &rhs ){ return lhs.X*rhs.Y -lhs.Y*rhs.X; }
//IsCollide()から使われる作業関数.
//A[iA]とB[iA]を通る直線がAとBを分離するかどうか調べる
bool DivisionCheck( const Vec (&A)[4], const Vec (&B)[4], int iA, int iB )
{
Vec L = A[iA] - B[iB];
if( L.Norm() <= std::numeric_limits<double>::epsilon() )return false;
double Base = CP( A[ (iA+1)%4 ] - B[iB], L );
for( int i=2; i<4; ++i )
{
if( Base * CP( A[ (iA+i)%4 ] - B[iB], L ) < 0 )return false;
}
for( int i=1; i<4; ++i )
{
if( Base * CP( B[ (iB+i)%4 ] - B[iB], L ) > 0 )return false;
}
return true;
}
//矩形Aと矩形Bとの間の当たり判定
bool IsCollide( const Vec (&A)[4], const Vec (&B)[4] )
{
for( int iA=0; iA<4; ++iA )
{
for( int iB=0; iB<4; ++iB )
{
if( DivisionCheck( A,B, iA,iB ) )return false;
}
}
return true;
}