화면에 ~ 10 개의 원이 있고 터치 동작을 통해 화면에서 밀고 끌 수있는 앱을 만듭니다. 이 서클 (원으로 그려진 UIView의 단순한 UIView)도 충돌 감지 기능을 가지고 있으며 충돌시 다른 서클을 밀어 내야한다는 아이디어가 있습니다. 이 앱에는 가속도 또는 중력도 없습니다. 동전을 밀기 만하면됩니다. 동전이 단순히 밀려나는 곳과 움직이는 것을 멈 추면 그렇게합니다.원형 대 원형 충돌 반응 - 동등 우선 순위
나는 touch-to-circle 상호 작용 작업과 circle-to-circle 작업의 기본 원리가 있습니다. 그러나 코드는 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;
}
}
}
}
감사합니다.
답변 해 주셔서 감사합니다. 호기심 때문에, 외부 라이브러리의 도움없이 Objective-C에서 다중 충돌 감지/반응 시스템을 구축하는 것이 가능하지 않습니까? –