ゲームプログラミングはたのしいですよ
衝突判定
ボクは四角いキャラクターしか扱えませんし、3Dなんて触ったこともないので、ここでは矩形同士の判定について書きます。
2Dの矩形のあたり判定を真面目に書くなんて、なんて頭の弱い子なんだ!
前提条件
- オブジェクトは位置と大きさを持つ。
harfWidthとharfHeightは、widthとheightをそれぞれ半分にしたものです。
だって、ほとんど半分の値で調べるんだもの。
| 位置 |
position.X / position.Y |
| 大きさ |
harfWidth / harfHeight |
- 片方のオブジェクトは速度を持つ
あたり判定はオブジェクトの移動と切り離すことができません。移動→判定ですよね!
なぜ片方かといいますと、両方同時に移動するのは大変だからです(何
私のような凡人のつくるゲームに、一般的な判定処理を入れるなんて難しすぎてできません。
片方のみ移動し、当たり判定を行うことにいたします。
別に変数名にこだわりはありません。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