cocos2dやIPhone/iPadのゲームで「当たり判定」を実装する方法。

今日は、ある作業をしているなかで、少し勘違いをしていた部分があったのでこれをメモ替わりに書いておきます。内容は「当たり判定」について。ゲームの中には色々な当たり判定があります。例えば、「攻撃が当たる」とか「ある場所に接触する」とか多くの場面で利用します。これをcoco2dもといiPhone上で利用する方法を考えていました。

CGRectとCGPoint

まずは「当たり判定」に必要な2つの値。 CGPointはオブジェクトのX座標、Y座標などの場所を表します。 CGRectはオブジェクトのX座標、Y座標に加えて、長さ(height)と横幅(width)を表します。

CGRectPoint

CGRectは以下のようにCGRectMakeを利用して導きます。 [c] CGRect rect = CGRectMake(playerPoint.x - (w/2), playerPoint.y -(h/2), w, h); [/c]

CGRectContainsPoint()を利用する

あるオブジェクトのCGRectとCGpointが重なりあったときに「1」を返す関数です。 下記図では②の時に1を返します。 CGRectPoint2

CGPointはオブジェクトの中心になるので、中心に触れて何かのアクションを起こしたい際はこのCGRectContainsPoint()を使えばいいと思います。 [c] //例 //Playerとobject if (CGRectContainsPoint(objectRect, player.position )){

 //お互いが重なったときの処理をifの中に書きます。         
  [player hitAction];

}

[/c]

CGRectContainsRect()を利用する

あるオブジェクトのCGRectとCGRectが重なりあったときに「1」を返す関数です。 下記図では②の状態で「1」を返します。 CGRectPoint3

[c] //例 //Playerとobject if (CGRectContainsPoint(objectRect, playerRect )){

 //お互いが重なったときの処理をifの中に書きます。         
  [player hitAction];

}

[/c]

注意点 このことで今日かなり苦戦をしていたのですが、このやり方だと図③の状態では「当たり判定」をしてくれません。 どちらかが完全に重なり合わないと判定をしてくれないのです。

CGRectIntersectsRect()を使う

さきほどの注意点を克服する方法が、このCGRectIntersectsRect()を使うことです。 これを使えば、上記図③の状態でも当たり判定をしてくれます。

[c] //例 //Playerとobject if (CGRectIntersectsRect(objectRect, playerRect )){

 //お互いが重なったときの処理をifの中に書きます。         
  [player hitAction];

}

[/c]

最後に

今日色々やってみた所、「当たり判定」には以下の2つを使えばよいと思います。

細かい判定に関しては、CGRectを調整して行えばうまくいきます。