簡體   English   中英

如何檢測2個UIView之間的碰撞

[英]How to detect Collision between 2 UIViews

我有一個包含我的主要角色的UIImageView,並且使UIImageView顯示為圓形,請參見下面的代碼以創建我的角色

copter = [[UIImageView alloc] initWithFrame:CGRectMake(100, 500, 90, 90)];
[copter setContentMode:UIViewContentModeScaleAspectFit];
copter.layer.cornerRadius = roundf(copter.frame.size.width/2.0);
copter.layer.masksToBounds = YES;
[copter startAnimating];
[[self view] addSubview:copter];
[self setBat:copter];

我的角色與游戲中其他物體之間發生碰撞時遇到麻煩。 在矩形而不是圓形上檢測到碰撞。 我到處搜索了解決此問題的答案,但沒有運氣。

這是我正在使用的碰撞代碼:

 self.batVelocity += [link duration]*FBDownardBatAccelerationIpad;

 [[self copter] setFrame:CGRectOffset([[self copter] frame], 0, [self batVelocity])];

 UIView *removeBlock = nil;
 for (UIView *block in [self blocks]) {
      [block setFrame:CGRectOffset([block frame], [link duration]*FBSidewaysVelocityIpad, 0)];
       if (CGRectIntersectsRect([[self copter] frame], [block frame])) {
             [self failed];

因此,基本上,我需要字符的圓邊界與矩形對象碰撞,而不是圓所在的矩形邊界。我希望這是有道理的。

提前致謝

我會使用CGPathRef或CGMutablePathRef。 因此,正如@ user3386109建議的那樣,請首先檢查rect之間是否存在沖突,然后如果您的sprite包含pathRef或其他內容,則可以使用CGPathContainsPoint()。 Quartz還為Rects的CGPathRef提供了一些其他比較功能,並且要將路徑與第二條路徑進行比較,請檢查文檔。 我發現CGPathRef非常有效,但是不要忘了使用CGPathRelease()來釋放它,以匹配每個CGPathCreate或CGPathCopy()函數,否則泄漏會很快增加。

對,所以首先您要檢查重疊的矩形(您已經完成了)。 當發現重疊時,則需要優化碰撞測試。 對於有問題的矩形的每個角,計算從角色中心到有問題的矩形的角的距離。 如果從中心到任意一個角的距離小於圓的半徑,則發生碰撞。 要稍微優化代碼,請計算(dx * dx + dy * dy)並將其與半徑平方進行比較。 這樣,您不必計算任何平方根。

進一步檢查后,除了角檢查外,還需要進行邊緣檢查。 例如,如果頂部y值在圓心上方,而底部y值在圓心下方,則計算矩形左邊緣和圓心之間的x差,如果該距離小於半徑,則發生了碰撞。 對於矩形的其他三個邊緣也是如此。

這是一些用於拐角檢查的偽代碼

int dx, dy, radius, radiusSquared;

radiusSquared = radius * radius;
for ( each rectangle that overlaps the player rectangle )
{
    for ( each corner of the rectangle )
    {
        dx = corner.x - center.x;
        dy = corner.y - center.y;
        if ( dx * dx + dy * dy < radiusSquared )
            Collision!!!
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM