Xcode - обнаружение столкновения нарисованных линий пользователем - PullRequest
2 голосов
/ 17 марта 2011

Я создаю игру, в которой UIImageView (шар) случайно подпрыгивает по краям экрана iphone.Затем пользователь должен нарисовать линии пальцем, чтобы направить мяч в лунку / цель.Мне удалось реализовать случайно подпрыгивающий мяч и возможность рисовать на экране.Моя проблема в том, что я не могу на всю жизнь обнаружить столкновение между мячом и нарисованной пользователем линией.Мяч просто проходит через него.Я пытался использовать CGRectIntersectsRect, но я уверен, что этот метод не будет работать.То, что я в основном хочу, - это какой-то способ заставить мяч отскочить от нарисованной пользователем линии.Если у кого-то есть идеи, как это сделать, и я могу помочь, я был бы очень благодарен.

Заранее спасибо

Я добавил некоторый код, чтобы попытаться помочь вам, ребята, понять, в чем заключается моя настройка.экран

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  

fingerSwiped = NO;
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self.view];
startPoint = [touch locationInView:self.view];
lastPoint.y -= 0;

}

прикосновения перемещаются, когда палец перемещается по экрану

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

fingerSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self.view];
currentPoint.y -= 0;
UIGraphicsBeginImageContext(self.view.frame.size);

[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width,                    self.view.frame.size.height)];

CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);

// sets the width of the line
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
//sets the colour of the line drawn

//red
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
//green
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 1.0, 0.0, 1.0);
//blue
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 1.0, 1.0);
//black
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
//draws a line to the point where the user has touched the screen
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

lastPoint = currentPoint;

fingerMoved++;

}

Вот что я сейчас пытаюсь использовать для фактического обнаружения столкновения ...

float a = lastPoint.y - startPoint.y;
float b = startPoint.x - lastPoint.x;
float c = lastPoint.x * startPoint.y - startPoint.x * lastPoint.y;
float d = abs(a * ball.center.x + b *ball.center.y + c)/sqrtf(powf(a,2)+ powf(b,2));

if(d ==0){
    NSLog(@"collision detected");

}

Ответы [ 2 ]

1 голос
/ 17 марта 2011

пожалуйста, напишите какой-нибудь код.

время важно для обнаружения столкновений, и вы просто не задаете вопрос в нужное время.Сначала проверьте ваш код.сделайте шарик и линию, которые явно сливаются и запускают вас детектором.Если он тестирует правильно, то, скорее всего, это связано с тем, что он не спрашивает «сталкиваются ли эти объекты» в нужное время.

1 голос
/ 17 марта 2011

Я не знаю Xcode, но, предположительно, эти два нарисованных объекта (шар и линия) имеют некоторое пространство координат.Я предполагаю, что у мяча есть позиция и радиус, а у линии есть некоторые конечные точки.Перед перемещением мяча от того места, где он есть, к месту, где он будет находиться в следующем кадре, вы «проверяете» предлагаемое новое местоположение, чтобы увидеть, коснулся ли круг линии.Если линия «бесконечна» или, по крайней мере, идет к краям экрана, то наиболее близким подходом между двумя объектами будет линия, которая соединяет центр круга с линией и перпендикулярна этой линии.Наклон перпендикулярной линии составляет -1 * 1 / м от исходной линии (где m - наклон).Вы можете начать с центра вашего круга и нарисовать тестовую линию с этим наклоном и вычислить, где будет пересечение тестовой линии с нарисованной пользователем линией с некоторой алгеброй.Затем просто вычислите длину этого отрезка, и если он короче радиуса шара, вы попадаете на линию.

Если линия является коротким отрезком по сравнению с мячом, вы можете выбрать несколько точек вдоль линии и проверить их непосредственно по центру шара, снова сравнив расстояние до центра с радиусом.

...