cocos2dx:衝突判定を実装する1回目

cocos2dxで衝突判定を実装するシリーズとしてこれから3回に分けてブログに書いていきたいと思います。 この辺りは、自分でもこの一ヶ月近く色々試している部分なんですが、何とか形になる部分が自分の中にありますので、それを紹介したいと思います。 ちなみに、タイルマップを利用した衝突判定を書きますので、もし参考にできるものがあれば幸いです。

第一回目は、cocos2dxで衝突判定をするために必要なメソッドなどの紹介をします。

CCPoint

オブジェクトの座標はCCPointクラスで表現されています。 CCPointは下記の方法で作成ができます。 [c]

ccp(x,y) CCPointMake(x,y)

[/c]

このCCPointは、デバイスのx座標とy座標で表現されています。

例えばCCSpriteクラスでオブジェクトを作成した時には、setPosition()メソッドを利用して座標を決めます。 [c]

sprite = CCSprite::create("enemy.png"); sprite->setPosition(ccp(100,100));

[/c]

デフォルトですと、画像の中心がそれに当たります。 また、アンカーポイントを変更すれば、この位置を修正できます。

Ccpoint

CCRect

CCRectでは、オブジェクトの画像の領域を表せます。 CCRectは以下の方法で作成できます。 [c]

CCRectMaKe(x,y,width,height); sprite->boundingBox();

[/c] CCRectMakeでそれぞれの値を指定して上げる方法と、スプライトの画像のCCRectを取り出すboundingBox()を利用します。 既に画像がある場合は、boundingBoxを使うと簡単に導き出せます。

Ccrect

衝突判定で使える2つの方法

上記で説明したCCPointをCCRectを使って、衝突判定を行います。

CCPointとCCRectを使った衝突判定

CCRectクラスにある【containsPoint】を利用すれば、指定されたCCPointがCCRectの領域内に触れた時にtrueを返します。 これを利用すれば、CCRectの領域内に、指定されたCCPointが入った時の判定ができます。

[c]

CCPoint point = sprite->getPosition(); CCRect rect; = enemy->boundingBox();

if(rect.containsPoint(point)){

//trueの場合に、何かしらの処理を行う

}

[/c]

Point2

CCRectとCCRectを使った衝突判定

CCRectとCCRectの領域が重なった時にtrueを返す【intersectsRect】メソッドを利用します。 利用方法は以下の様な感じです。

[c]

CCRect rect = sprite->boundingBox(); CCRect rect2 = enemy->boundingBox();

if(rect.intersectsRect(rect2){

//trueの場合に、何かしらの処理を行う

}

[/c]

Rect2

最後に

今回は、cocos2dxの基本的なことを書きました。 次回はタイルマップのレイアーとの衝突判定について書いていきたいと思います。

Cocos2d‐x開発のレシピ―iOS/Android対応Cocos2d‐x開発のレシピ―iOS/Android対応
松浦 晃洋,齊藤 建二,古木 映治

秀和システム
売り上げランキング : 1224

Amazonで詳しく見る