CCSprite 碰撞偵測


CCSprite 並沒有內建碰撞方法的設計,所以我們必須自己寫,不過大部分偵測碰撞的原理都是相同的,假設有 A, B 2個 Sprite 要偵測碰撞,首先取得 A Sprite 的 X,Y 座標,再根據 "錨點(AnchorPoint)" 計算 A Sprite 的面積, 接著也對 B Sprite 作相同的處理,最後再判斷這2個面積是否有重疊(碰撞),必須注意錨點的位置, CCSprite 預設錨點為中心位置, 如下紅點






所以當我們取得 X,Y 座標時,是以中心點開始計算,加上寬(width),高(height),位置會偏移,如下圖








有2個方法可以解決,第1個是開始建立 CCSprite 就設定新錨點,如下

   1:  CCSprite* tempspr = CCSprite::spriteWithFile("CloseNormal.png");
   2:  tempspr->setAnchorPoint(ccp(X,Y))

其中 ccp(X,Y) 為錨點比例,預設是0.5,0.5,你可以自由修改錨點,對齊左上或左下

第2個方法為計算 X,Y 座標時就先對錨點的偏移量作處理,如下

   1:  CCRect ccr1 = CCRect(spr1->getPositionX()-spr1->getContentSize().width/2,spr1->getPositionY()-spr1->getContentSize().height/2,spr1->getContentSize().width,spr1->getContentSize().height);

其中 -spr1->getContentSize().width/2 就是計算 實際位置的 X 座標,相同的 -spr1->getContentSize().height/2 為計算實際位置的 Y 座標,計算碰撞的方法如下


   1:  bool GameLogoScene::detectCollide(CCSprite* spr1,CCSprite* spr2)
   2:  {
   3:      bool iscollide = false;
   4:      
   5:      CCRect ccr1 = CCRect(spr1->getPositionX()-spr1->getContentSize().width/2,spr1->getPositionY()-spr1->getContentSize().height/2,spr1->getContentSize().width,spr1->getContentSize().height);
   6:   
   7:      CCRect ccr2 = CCRect(spr2->getPositionX()-spr2->getContentSize().width/2,spr2->getPositionY()-spr2->getContentSize().height/2,spr2->getContentSize().width,spr2->getContentSize().height);
   8:   
   9:      if(CCRect::CCRectIntersectsRect(ccr1,ccr2))
  10:      {
  11:          iscollide = true;
  12:      }
  13:   
  14:      CCLog("iscollide:%d",iscollide);
  15:   
  16:      return iscollide;
  17:  }