アットウィキロゴ
ゲームプログラミングはたのしいですよ


衝突判定

ボクは四角いキャラクターしか扱えませんし、3Dなんて触ったこともないので、ここでは矩形同士の判定について書きます。
2Dの矩形のあたり判定を真面目に書くなんて、なんて頭の弱い子なんだ!

前提条件

  • オブジェクトは位置と大きさを持つ。
    harfWidthとharfHeightは、widthとheightをそれぞれ半分にしたものです。
    だって、ほとんど半分の値で調べるんだもの。
位置 position.X / position.Y
大きさ harfWidth / harfHeight
  • 片方のオブジェクトは速度を持つ
    あたり判定はオブジェクトの移動と切り離すことができません。移動→判定ですよね!
    なぜ片方かといいますと、両方同時に移動するのは大変だからです(何
    私のような凡人のつくるゲームに、一般的な判定処理を入れるなんて難しすぎてできません。
    片方のみ移動し、当たり判定を行うことにいたします。
速度 speed.X / speed.Y
別に変数名にこだわりはありません。velocityとか、わかりやすい名前を付けてくださいね。

キャラクター同士のあたり判定

たとえば、主人公(Hero)と敵キャラクター(Enemy)のあたり判定です。
当たっていればtrue, 当たってなければfalse。簡単ですね。
条件式は以下な感じでどうでしょう。
((Hero.position.X + Hero.speed.X + Hero.harfWidth) > (Enemy.position.X - Enemy.harfWidth) &&
 (Hero.position.X + Hero.speed.X - Hero.harfWidth) < (Enemy.position.X + Enemy.harfWidth) &&
 (Hero.position.Y + Hero.speed.Y + Hero.harfHeight) > (Enemy.position.Y - Enemy.harfHeight) &&
 (Hero.position.Y + Hero.speed.Y - Hero.harfHeight) < (Enemy.position.Y + Enemy.harfHeight) )
{
    isHit = true;
}
簡単にいえば、2つのオブジェクトの距離がオブジェクトの大きさより小さければ、当たってるんですね。
そんな条件式に見えないけどね。
上を分かりやすく変形すれば以下の式になる(はず)です。
((Math.Abs(Hero.position.X + Hero.speed.X - Enemy.position.X) < (Hero.harfWidth  + Enemy.harfWidth )) &&
 (Math.Abs(Hero.position.Y + Hero.speed.Y - Enemy.position.Y) < (Hero.harfHeight + Enemy.harfHeight)) )
{
    isHit = true;
}

マップとのあたり判定

ここでは2Dアクションゲームを考えて、
マップにあたっていればあたる寸前に戻す
処理を作りたいと思います。


名前:
コメント:

最終更新:2009年01月14日 00:28