[英]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.