我正在创建一个应用程序,屏幕上会有~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;
}
}
}
}
感谢您的帮助。
答案 0 :(得分:0)
看起来很简单,除非我遗漏了什么。而不是在touchesMoved中对Circle01进行硬编码,而是根据用户触摸的视图进行命中检测。这样,无论他们拖动什么视图都将获得优先权。