我試圖創建一個碰撞檢測方法,檢查我的兩個對象(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(@ 「碰撞檢測」); }
不應該在vertical(y)上使用size.height嗎? –
該代碼基於本書iPhone遊戲開發中提到的2d碰撞檢測代碼,在那裏它說.width,但我同意感覺應該是.height。嘗試過,但它沒有奏效。是否有另一種方法可以創造出ecollision methos並獲得我期待的相同結果? – iphonedevonthemake
我建議也許這本書有一個印刷錯誤。在處理書本上的事情時,最好將其作爲指導,而不是僅僅複製代碼 - 必要時用鉛筆和紙張進行處理,這不僅可以幫助您刪除錯誤,還可以幫助您理解主題物。 –