cocos2d-x-3.3-019-碰撞檢測1-矩形地區是否相交,cocos2d碰撞檢測
原文同步發佈於我的wiki,查看原文或更新請移步: 點擊開啟連結
原理
- Cocos裡面的每個Node都有一個和它對應的矩形地區,通過api getBoundingBox()得到。碰撞監測就是判斷兩個物體的矩形地區是否有交疊,相應的API是intersectsRect。有交疊則認為是碰撞了。
Demo及源碼
- 基於cocos 3.4final
- https://github.com/cheyiliu/CollisionDetection
Demo解讀
- 每隔5s產生: 兩架飛機,並從右往左飛行; 兩顆子彈,從左向右飛。
- 每一幀裡面作碰撞檢測,若有碰撞,則播放相應的動畫。
- 為了追蹤所有的子彈和飛機,得有對應的輔助資料結構,這裡採用Vector。
主要代碼
scheduleUpdate(); schedule(schedule_selector(HelloWorld::updateCustom), 5.0f, kRepeatForever, 0);
void HelloWorld::buildBullet(int startX, int endX, int actualY) { log("buildBullet"); std::string name = "bullet1.png"; auto sp = Sprite::createWithSpriteFrameName(name); Point startPos = Point(startX, actualY); Point endPos = Point(endX, actualY); sp->setPosition(startPos); sp->runAction( Sequence::create(MoveTo::create(3.0, endPos), CallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDone)), NULL)); sp->setRotation(-90); sp->setTag(TAG_BULLET); mBullets.pushBack(sp);//放入數組 this->addChild(sp);}
- 每一幀裡作碰撞監測,這裡簡單demo了下。 更複雜的邏輯處理見擴充閱讀
void HelloWorld::update(float dt) {// log("update, %d", mPlanes.size());// log("update, %d", mBullets.size()); //碰撞檢測 Vector<Sprite*> bulletsToBeRemoved; Vector<Sprite*> planeToBeRemoved; for (auto bullet : mBullets) { for (auto plane : mPlanes) { if (bullet->boundingBox().intersectsRect(plane->getBoundingBox())) { log("碰撞了。。。。。。。。"); bulletsToBeRemoved.pushBack(bullet); planeToBeRemoved.pushBack(plane); } } } // do remove for (auto bullet : bulletsToBeRemoved) { mBullets.eraseObject(bullet); log("removeChild(bullet)"); this->removeChild(bullet); } bulletsToBeRemoved.clear(); for (auto plane : planeToBeRemoved) { mPlanes.eraseObject(plane); planeBlowup(plane); } planeToBeRemoved.clear();}
優缺點
- 優點: 對於簡單需求,使用起來簡單
- 缺點: 要費力的維護幾個數組,當需求複雜時不易擴充和複用
https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/CollisionDetection-way1-use-intersectsRect.gif
擴充閱讀
- AABB碰撞原理: http://blog.csdn.net/u012945598/article/details/39524343
- 飛機大戰碰撞: http://blog.csdn.net/jackystudio/article/details/11917875