en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

11.29.2010

Core Graphic 的碰撞偵測

 

若要判斷兩個 ImageView 物件是否發生碰撞,可使用 SDK 內建的 CGRectIntersectsRect 函式,其程式碼如下。(View-based Template)

//被Timer/計時器所執行的函式,其目的是讓兩個ImageView以相反方向左右來回移動
-(void)objectMoving:(NSTimer *)theTimer {
    objectViewA.center = CGPointMake(objectViewA.center.x + objectMovementA.x, objectViewA.center.y + objectMovementA.y);
    objectViewB.center = CGPointMake(objectViewB.center.x + objectMovementB.x, objectViewB.center.y + objectMovementB.y);

    //呼叫自行定義的檢測碰撞函式
    [self intersectDetection];

    //設定物件objectViewA移動到達螢幕邊界時,的反彈動作
    if (objectViewA.center.x <= 20 || objectViewA.center.x >= 300) {
         objectMovementA.x = -objectMovementA.x;
    }

    if (objectViewB.center.x <= 20 || objectViewB.center.x >= 300) {
         objectMovementB.x = -objectMovementB.x;
    }
}

以下自行定義的檢測碰撞函式。

-(void) intersectDetection {

    //iOS SDK內建的碰撞函式,發生碰撞會回傳YES
    if (CGRectIntersectsRect(objectViewA.frame, objectViewB.frame)) {
        messageLabel.text = @"發生碰撞";
    }
    else {
        messageLabel.text = @"";
    }

}






4 則留言:

  1. 匿名5/08/2012

    請問可以提供範例下載嗎?光這樣看不懂=.=因畫面上只有兩個imageView,但程式卻有四個=.=

    回覆刪除
    回覆
    1. 程式只有2個view唷,objectViewA與objectViewB,它們就是圖上面看到的深淺灰色矩形。
      至於 objectMovementA 與 objectMovementB ,非常抱歉程式碼並沒有說的很清楚,這兩個其實只是CGPoint,它們的作用只是「定義」objectViewA和objectViewB的「位移量」。

      而本篇的「關鍵」程式碼,用來判斷兩個View是否碰撞,只有 CGRectIntersectsRect(objectViewA.frame, objectViewB.frame)。
      造成您的誤會,真的非常抱歉。

      刪除
  2. 就兩個uiview的CGRect矩形區塊重疊啦,還看得懂,感謝了~

    回覆刪除