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]
デフォルトですと、画像の中心がそれに当たります。 また、アンカーポイントを変更すれば、この位置を修正できます。
CCRect
CCRectでは、オブジェクトの画像の領域を表せます。 CCRectは以下の方法で作成できます。 [c]
CCRectMaKe(x,y,width,height); sprite->boundingBox();
[/c] CCRectMakeでそれぞれの値を指定して上げる方法と、スプライトの画像のCCRectを取り出すboundingBox()を利用します。 既に画像がある場合は、boundingBoxを使うと簡単に導き出せます。
衝突判定で使える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]
CCRectとCCRectを使った衝突判定
CCRectとCCRectの領域が重なった時にtrueを返す【intersectsRect】メソッドを利用します。 利用方法は以下の様な感じです。
[c]
CCRect rect = sprite->boundingBox(); CCRect rect2 = enemy->boundingBox();
if(rect.intersectsRect(rect2){
//trueの場合に、何かしらの処理を行う
}
[/c]
最後に
今回は、cocos2dxの基本的なことを書きました。 次回はタイルマップのレイアーとの衝突判定について書いていきたいと思います。
Cocos2d‐x開発のレシピ―iOS/Android対応 松浦 晃洋,齊藤 建二,古木 映治 秀和システム 売り上げランキング : 1224 Amazonで詳しく見る |