前回はオブジェクトとタイルマップとの衝突判定を実装する方法を紹介しました。
◀前回▶
今回は、オブジェクトとオブジェクト動詞の衝突判定について紹介します。 今回実装するのは、動いているオブジェクトではなく、固定されているオブジェクト(はてなボックスやブロック)との衝突判定です。 基本的は、同じやり方でできると思いますので、こちらはご自身で考えて実装をしてみて下さい。
オブジェクトの配置
今回のシリーズは「タイルマップ」を使った衝突判定です。 まずは、このタイルマップ上に、オブジェクトを配置していきましょう。
オブジェクトをタイルマップ上に表示させる
次にこれをタイルマップ上に表示させます。 方法に関しては、こちらのエントリーを参考にして下さい。
オブジェクトの衝突判定
ここからが本番です。 先ほど設置したオブジェクトとの衝突判定を実装します。 [c] GameObject GameLayer::getObject(CCPoint objPoint,GameObject obj){
CCObject *mapChild = NULL;
CCARRAY_FOREACH(map->getChildren(), mapChild){
bool boolCollisionObject = dynamic_cast<CollisionObject*>(mapChild);
if (boolCollisionObject) {
CCRect _objRect = obj->boundingBox();
GameObject *_mapObj = (GameObject*)mapChild;
CCRect _childRect = _mapObj->boundingBox();
if (_objRect.intersectsRect(_childRect)) {
return _mapObj;
}
}
}
return NULL;
} [/c] 簡単に説明するとタイルマップに追加されているオブジェクトの中から、衝突を判定するオブジェクトを取り出して、CCRect同士が重なっていないかを判定します。 今回の場合、CollisionObjectが親クラスのオブジェクトを抜き出しています。
後は、これをルート内で利用して、衝突判定時に特殊なアクションを行うようにします。
最後に
簡単ながら、私が利用しているタイルマップとの衝突判定について紹介をさせていただきました。 難しいのは、この衝突判定をどのように利用していくかだと思います。 移動を止めるのか、オブジェクトが消えるのか、色々なことが可能です。