title: iPhone - Detect collision of multiple buttons
body: <p>I've just started to develop in iPhone and I've managed to make my buttons (six of them) to move with UIAccelerator. Problem I'm facing when they are colliding with each other. I want them to bounce back the same direction, and this works if I only use 2 buttons. But when there are multiple collisions with more than 2 buttons, they get overlapped and finally merged into each other. </p>
  
  <p>Here's my code to set delegate itself:</p>
  
  <pre><code>UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
  accel.delegate = self;
  accel.updateInterval = 1.0f/60.0f;
  </code></pre>
  
  <p>Delegate method of accelerator:</p>
  
  <pre><code>- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
  delta.x = acceleration.x * 5;
  delta.y = acceleration.y * -5;
  
  self.firstButton.center = CGPointMake(self.firstButton.center.x + delta.x, self.firstButton.center.y + delta.y);
  self.secondButton.center = CGPointMake(self.secondButton.center.x + delta.x, self.secondButton.center.y + delta.y);
  self.thirdButton.center = CGPointMake(self.thirdButton.center.x + delta.x, self.thirdButton.center.y + delta.y);
  self.fourthButton.center = CGPointMake(self.fourthButton.center.x + delta.x, self.fourthButton.center.y + delta.y);
  self.fifthButton.center = CGPointMake(self.fifthButton.center.x + delta.x, self.fifthButton.center.y + delta.y);
  self.sixthButton.center = CGPointMake(self.sixthButton.center.x + delta.x, self.sixthButton.center.y + delta.y);
  
  [self updateMovingObjects:self.firstButton];
  [self updateMovingObjects:self.secondButton];
  [self updateMovingObjects:self.thirdButton];
  [self updateMovingObjects:self.fourthButton];
  [self updateMovingObjects:self.fifthButton];
  [self updateMovingObjects:self.sixthButton];
  }
  </code></pre>
  
  <p>updateMovingObjects:</p>
  
  <pre><code>- (void)updateMovingObjects:(UIButton *)button{
  /*** DETECT COLLISIONS ***/
  
  // Right screen
  if(button.center.x &lt; button.frame.size.width / 2){
      button.center = CGPointMake(button.frame.size.width / 2, button.center.y); 
  }
  // Left screen
  if(button.center.x &gt; 320 - button.frame.size.width / 2){
      button.center = CGPointMake(320 - button.frame.size.width / 2, button.center.y); 
  }
  // Top screen
  if(button.center.y &lt; button.frame.size.height / 2){
      button.center = CGPointMake(button.center.x, button.frame.size.height / 2); 
  }
  // Bottom screen
  if(button.center.y &gt; 480 - 20 - 43 - button.frame.size.height / 2){
      button.center = CGPointMake(button.center.x, 480 - 20 - 43 - button.frame.size.height / 2); 
  }
  
  // Detect collision with objects
  for (UIView *anotherView in [self.view subviews]) {
      if (button == anotherView){
          continue;
      }
      if(CGRectIntersectsRect(button.frame, anotherView.frame)){
          float_t vec = sqrtf(powf(delta.x, 2.0)+powf(delta.y, 2.0));
          // collided from left or bottom
          if( (button.center.x + button.frame.size.width / 2 &gt;= anotherView.center.x - anotherView.frame.size.width / 2 &amp;&amp;
               button.center.x + button.frame.size.width / 2 &lt;= anotherView.center.x - anotherView.frame.size.width / 2 + 15)
             ||  (button.center.y - button.frame.size.height / 2 &lt;= anotherView.center.y + anotherView.frame.size.height / 2 &amp;&amp;
                  button.center.y - button.frame.size.height / 2 &gt;= anotherView.center.y + anotherView.frame.size.height / 2 - 15) ){
                 button.center = CGPointMake(button.center.x - vec, button.center.y + vec);
             }
          // collided from top or right
          else{
              button.center = CGPointMake(button.center.x + vec, button.center.y - vec);
          }
      }
  }
  
  /*** END DETECT COLLISIONS ***/
  }
  </code></pre>
  
  <p>Thanks in advance.</p>
  
  <p>EDIT: I made for functions which detects if it was collided from left, right, bottom or top. And works much better now, but problem still remains with overlapping if I have them all at once moving, my guess is that it doesn't have the time calculate and thus get overlapped:</p>
  
  <pre><code>- (BOOL)collidedFromLeft:(UIButton *)button{
  for (UIView *anotherView in [self.view subviews]) {
      if (button == anotherView){
          continue;
      }
      if(CGRectIntersectsRect(button.frame, anotherView.frame)){
          if(button.center.x + button.frame.size.width / 2 - delta.x &lt; anotherView.center.x - anotherView.frame.size.width / 2 &amp;&amp;
             button.center.x + button.frame.size.width / 2 &gt;= anotherView.center.x - anotherView.frame.size.width / 2){
              return YES;
          }
      }
  }
  return NO;
  </code></pre>
  
  <p>}</p>
  
  <pre><code>- (BOOL)collidedFromTop:(UIButton *)button{
  for (UIView *anotherView in [self.view subviews]) {
      if (button == anotherView){
          continue;
      }
      if(CGRectIntersectsRect(button.frame, anotherView.frame)){
          if(button.center.y + button.frame.size.height / 2 - delta.y &lt; anotherView.center.y - anotherView.frame.size.height / 2 &amp;&amp;
             button.center.y + button.frame.size.height / 2 &gt;= anotherView.center.y - anotherView.frame.size.height / 2){
              return YES;
          }
      }
  }
  return NO;
  </code></pre>
  
  <p>}</p>
  
  <pre><code>- (BOOL)collidedFromRight:(UIButton *)button{
  for (UIView *anotherView in [self.view subviews]) {
      if (button == anotherView){
          continue;
      }
      if(CGRectIntersectsRect(button.frame, anotherView.frame)){
          if(button.center.x - button.frame.size.width / 2 - delta.x &gt; anotherView.center.x + anotherView.frame.size.width / 2 &amp;&amp;
             button.center.x - button.frame.size.width / 2 &lt;= anotherView.center.x + anotherView.frame.size.width / 2){
              return YES;
          }
      }
  }
  return NO;
  </code></pre>
  
  <p>}</p>
  
  <pre><code>- (BOOL)collidedFromBottom:(UIButton *)button{
  for (UIView *anotherView in [self.view subviews]) {
      if (button == anotherView){
          continue;
      }
      if(CGRectIntersectsRect(button.frame, anotherView.frame)){
          if(button.center.y - button.frame.size.height / 2 - delta.y &gt; anotherView.center.y + anotherView.frame.size.height / 2 &amp;&amp;
             button.center.x - button.frame.size.width / 2 &lt;= anotherView.center.y + anotherView.frame.size.height / 2){
              return YES;
          }
      }
  }
  return NO;
  </code></pre>
  
  <p>}</p>
  
  <p>Then I check while they are moving:</p>
  
  <pre><code>if([self collidedFromLeft:button]){
      button.center = CGPointMake(button.center.x - 20, button.center.y);
  }
  if([self collidedFromRight:button]){
      button.center = CGPointMake(button.center.x + 20, button.center.y);
  }
  if([self collidedFromTop:button]){
      button.center = CGPointMake(button.center.x, button.center.y - 20);
  }
  if([self collidedFromBottom:button]){
      button.center = CGPointMake(button.center.x, button.center.y + 20);
  }
  </code></pre>