cocos2d-x-3.3-019-碰撞檢測1-矩形地區是否相交,cocos2d碰撞檢測

來源:互聯網
上載者:User

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。
主要代碼
  • 開啟相關timer
        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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.