2011-06-30 65 views
2

我試圖創建一個碰撞檢測方法,檢查我的兩個對象(2個橢圓形uiimages)是否相互碰撞。如果他們這樣做,應該將BOOL值設置爲YES,否則應該將其設置爲NO。碰撞檢測

到目前爲止,它只是去檢查Ruby1是否高於Ruby2的IF語句。它不關心ruby1是否低於ruby2,或者甚至在ruby2的左邊或右邊。它只是繼續去那個IF語句。反之亦然。

-(void)CollisionDetect{ 


//can't be colliding because Ruby1 is too far left of Ruby2 

if(rubin1.frame.origin.x + rubin1.bounds.size.width < rubin2.frame.origin.x){ 

    CollisionRubies = NO; 
    NSLog(@"Collision left"); 
} 

//can't be colliding because Ruby1 is too far right of Ruby2 

if(rubin1.frame.origin.x > rubin2.frame.origin.x + rubin2.bounds.size.width){ 

    CollisionRubies = NO; 
    NSLog(@"Collision right"); 
} 

//can't be colliding because Ruby1 is too far below Ruby2 

if(rubin1.frame.origin.y + rubin1.bounds.size.width < rubin2.frame.origin.y){ 
    CollisionRubies = NO; 
    NSLog(@"Collision below"); 
} 

//can't be colliding because Ruby1 is too far above Ruby2 

if(rubin1.frame.origin.y < rubin2.frame.origin.y + rubin2.bounds.size.width){ 
    CollisionRubies = NO; 
    NSLog(@"Collision above"); 
} 

    if(rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){ 

    CollisionRubies = NO; 
    NSLog(@"Collision left"); 
} 

//can't be colliding because Ruby2 is too far right of Ruby1 

if(rubin2.frame.origin.x > rubin1.frame.origin.x + rubin1.bounds.size.width){ 

    CollisionRubies = NO; 
    NSLog(@"Collision right"); 
} 

//can't be colliding because Ruby2 is too far below Ruby1 

if(rubin2.frame.origin.y + rubin2.bounds.size.width < rubin1.frame.origin.y){ 
    CollisionRubies = NO; 
    NSLog(@"Collision below"); 
} 

//can't be colliding because Ruby2 is too far above Ruby1 

if(rubin2.frame.origin.y < rubin1.frame.origin.y + rubin1.bounds.size.width){ 
    CollisionRubies = NO; 
    NSLog(@"Collision above"); 
} 

//if we get here, the two rects MUST be colliding 
CollisionRubies = YES; 
NSLog(@"Collision detected"); 

}

如果BOOL值爲NO然後如下面的否則將停止移動,直到它檢測到ruby2不是在它的前面的代碼ruby1將移動到該位置。反之亦然。

-(void)dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position{ 
// Check to see which view, or views, the point is in and then move to that position. 
if (CGRectContainsPoint([rubin1 frame], position)) { 

    if(!CollisionRubies){ 

     rubin1.center = position; 
    } 
    if (CGRectContainsPoint([rubin2 frame], position)) { 

    if(!CollisionRubies){ 

     rubin2.center = position; 
    } 


} 

碰撞檢測方法是從touchesmoved方法

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

[self CollisionDetect]; 

NSLog(@"touchesMoved"); 
if(!GamePaused){ 
     // Enumerates through all touch objects 
     for (UITouch *touch in touches) { 

      // Send to the dispatch method, which will make sure the appropriate subview is acted upon 
      [self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self.view]]; 
     } 
} 

我在做什麼錯了叫什麼?

** * ** * ** * *UPDATE* ** * ** * ** * ** * ** * ** * ** * ** * ** * ***

-(void)CollisionDetect{ 

//不能碰撞,因爲Ruby1是,如果(rubin1.frame.origin過於靠左Ruby2

的.X + rubin1.bounds.size.width < rubin2.frame.origin.x){

CollisionRubies = NO; 
NSLog(@"Collision left"); 

}

//不能碰撞,因爲Ruby1太遠右Ruby2的

否則,如果(rubin1.frame.origin.x> rubin2.frame.origin.x + rubin2.bounds.size.width){

CollisionRubies = NO; 
NSLog(@"Collision right"); 

}

//不能碰撞,因爲Ruby1是遠遠低於Ruby2

否則,如果(rubin1.frame.origin.y + rubin1.bounds.size.width < rubin2。 frame.origin。y){CollisionRubies = NO; NSLog(@「Collision below」); }

//不能碰撞,因爲Ruby1是遠遠高於Ruby2

否則,如果(rubin1.frame.origin.y < rubin2.frame.origin.y + rubin2.bounds.size.width ){ CollisionRubies = NO; NSLog(@「Collision above」); }

if(rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){ 

CollisionRubies = NO; 
NSLog(@"Collision left"); 

}

//不能碰撞,因爲Ruby2太遠右Ruby1

否則,如果(rubin2.frame.origin.x> rubin1.frame.origin的。 X + rubin1.bounds.size.width){

CollisionRubies = NO; 
NSLog(@"Collision right"); 

}

//不能COLLID荷蘭國際集團因爲Ruby2太遠低於Ruby1

如果

否則(rubin2.frame.origin.y + rubin2.bounds.size.width < rubin1.frame.origin.y){ CollisionRubies = NO; NSLog(@「Collision below」); }

//不能碰撞,因爲Ruby2是遠遠高於Ruby1

否則,如果(rubin2.frame.origin.y < rubin1.frame.origin.y + rubin1.bounds.size.width ){ CollisionRubies = NO; NSLog(@「Collision above」); }

其他{// 如果我們來到這裏,兩個矩形必須被碰撞 CollisionRubies = YES; 的NSLog(@ 「碰撞檢測」); }

+0

不應該在vertical(y)上使用size.height嗎? –

+0

該代碼基於本書iPhone遊戲開發中提到的2d碰撞檢測代碼,在那裏它說.width,但我同意感覺應該是.height。嘗試過,但它沒有奏效。是否有另一種方法可以創造出ecollision methos並獲得我期待的相同結果? – iphonedevonthemake

+0

我建議也許這本書有一個印刷錯誤。在處理書本上的事情時,最好將其作爲指導,而不是僅僅複製代碼 - 必要時用鉛筆和紙張進行處理,這不僅可以幫助您刪除錯誤,還可以幫助您理解主題物。 –

回答

0

在你CollisionDetect方法,則需要在不同的點設置CollisionRubies = NO,但你然後在最後設置CollisionRubies = YES無論是剛剛發生的任何測試。你可能也只是有方法是一行

-(void)CollisionDetect{ 
    CollisionRubies = YES; 
} 

而且,似乎是與你碰撞的計算(寬度被計算的上方或下方時,其中y混合)

我想一個問題也建議你閱讀Objective-C的編碼風格指南。例如,使用變量和方法名首字母小寫。例如,collisionRubies-(void)collisionDetect這可以幫助其他人閱讀你的代碼快,如果它是用一種標準的方式。

+0

圖像是橢圓形的。所以我認爲這樣做會更容易確定圖像是否相互交叉。我的意思是我唯一想做的事情就是讓這兩幅可移動的圖像無法通過彼此。任何建議如何做到這一點? – iphonedevonthemake

+0

你說得對,但你只需要計算出你的計算結果(不要把寬度和y值混合在一起)。在紙上繪製很多場景並檢查您的計算。但是您需要在CollisionDetect方法中修復您的邏輯,因爲無論發生什麼事情,您都只需將CollisionRubies設置爲YES。 –

+0

我會嘗試...但我不知道如何從這裏實際上繼續... 我只是想讓他們無法通過對方時,我移動它們在屏幕上(與我的手指)......也許還有另一種方式來做這個...有什麼建議嗎? – iphonedevonthemake

0

而不是四是檢查從四個方向碰撞功能你爲什麼不使用

if(CGRectIntersectsRect(ruby1.frame,ruby2.frame) 
{ 
//your code 
} 

這着,當然,只有當你不需要知道從哪個對象接近另一個方向。

+0

我不能使用因爲圖像是橢圓形:(...我試過這種方式以及 – iphonedevonthemake

+0

的起點是關閉,所以當遊戲開始時,CollisionRubies的BOOL值立即變爲YES ... 圖像的起始位置應該從頭開始順便......但不是在彼此之上 – iphonedevonthemake

+0

CollisionRubies在CollisionDetect方法中轉向了YES,因爲你的邏輯在CollisionDetect方法中,請參閱我的答案以獲取詳細信息 –

1

正如一個側面說明,如果你使用了別的,如果你的代碼可能會多一點效率,特別是如果你經常呼籲CollisionDetect,我以爲你是。通過這種方式,如果其中一個早期的陳述聲明爲真,您可以忽略其餘的。

+0

Hm .. true ... thanks ...我會試試:) – iphonedevonthemake

+0

我試過了,如果等等...我更新了代碼abov e用新的方法......不幸的是它並沒有進入代碼標籤。任何方式......這一次,NSLog似乎相應地輸入了所有的IF語句......取決於位置......現在唯一剩下的就是如何阻止它們相互傳遞...... CollisionRubies從未成爲是:( – iphonedevonthemake