圆圈碰撞反应 - 同等优先

时间:2012-03-19 00:21:10

标签: iphone objective-c ios collision-detection

我正在创建一个应用程序,屏幕上会有~10个圆圈,可以通过触摸动作在屏幕上推动和拖动。这些圆圈(简单地说是带有圆圈的UIView)也会对它们进行碰撞检测,其想法是当碰撞时它们将其他圆圈推开。在这个应用程序中也没有加速或重力,它更像是推动硬币,只是将它们推开,当你停止移动时,它们也是如此。

我有触摸式圈子互动工作,以及圈到圈工作的基本原理。但是代码为Circle01提供了所有功能。 IE,它可以被推入其他圈子,他们将按照希望的方式移开。但当其他圆圈被推入其中时,它们会绕着Circle01移动,而不是将其推开。

我已经阅读了几十页有关碰撞检测的内容,但我对于如何修改此代码以使所有圈子具有相同的功率感到困惑。

相关代码:

MyCircle.m

- (void)drawRect:(CGRect)rect
{
 CGPoint viewCenter = CGPointMake(50,50);
 bpath = [UIBezierPath bezierPathWithArcCenter:viewCenter radius:50 startAngle:0 endAngle:DEGREES_TO_RADIANS(360) clockwise:YES];

 [[UIColor blueColor] setFill];
 [bpath fill];
}

CircleVC.m

- (void)viewDidLoad
{
    Circle01 = [[MyCircle alloc] initWithFrame:CGRectMake(200, 200, 100, 100)];
      Circle01.backgroundColor = [UIColor redColor];
      Circle01.alpha = 0.5;
      [self.view addSubview:Circle01];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  // Testing circle collision detection
  for (UIView *aView in self.view.subviews) 
  { 
    if (Circle01 == anotherView) 
    continue; 
    if (CGRectIntersectsRect(Circle01.frame, aView.frame)) 
    { 
      float xDistance = aView.center.x - Circle01.center.x;
      float yDistance = aView.center.y - Circle01.center.y;
      float distance = xDistance * xDistance + yDistance * yDistance;
      float angle = atan2(yDistance, xDistance);
      CGPoint newCenter;

      if (distance < 100 * 100) 
      {
        newCenter.x = Circle01.center.x + (Circle01.frame.size.width * cos(angle));
        newCenter.y = Circle01.center.y + (Circle01.frame.size.width * sin(angle));
        aView.center = newCenter;
      }
    }
  }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

看起来很简单,除非我遗漏了什么。而不是在touchesMoved中对Circle01进行硬编码,而是根据用户触摸的视图进行命中检测。这样,无论他们拖动什么视图都将获得优先权。