2016-10-07 4 views
1

Я переезжаю мой sknode по кругу, созданный с помощью этого кода:Перемещение SKNode по кругу

circleDiameter = 300; 
    pathCenterPoint = CGPointMake(self.position.x - circleDiameter/2, self.position.y - circleDiameter/2); 

    UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(pathCenterPoint.x, pathCenterPoint.y, circleDiameter, circleDiameter) cornerRadius:circleDiameter/2]; 
    self.actionClockwise = [SKAction followPath:circlePath.CGPath asOffset:false orientToPath:true duration:2]; 
    self.circleActionForever = [SKAction repeatActionForever:self.actionClockwise]; 
    [self runAction:self.actionCounterClockwise withKey:@"circleActionForever"]; 

И все работает. Теперь я хочу, чтобы, когда пользователь коснулся экрана, чтобы вернуть направление и переместить узел в counterClockwise. Я сделал это, выполнив одно и то же действие с командой .reversedAction.

Но действие всегда перезапускается с начальной точки.

Я хочу знать, есть ли какой-то метод, чтобы начать анимацию с точки, где старая анимация, когда пользователь нажимает на экран?

ответ

1

UIBezierPath состоит из пути Elements где первый является moveToPoint, что, как объяснено в official document, начинает новый подпуть в определенном месте в изменяемом графическом пути.

Так, к сожалению, не хватает рук дело:

UIBezierPath *circlePathReversed = [circlePath bezierPathByReversingPath]; 

, потому что, когда вы остановите свой круг от следования по пути, фактическое положение окружности не то же самое из moveToPoint точки (координаты х и у) ,

Однако вы можете перестроить свой путь, извлекая все элементы и повторно начать с фактического положения круга.

void MyCGPathApplierFunc (void *info, const CGPathElement *element) { 
    NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info; 

    CGPoint *points = element->points; 
    CGPathElementType type = element->type; 

    switch(type) { 
     case kCGPathElementMoveToPoint: // contains 1 point 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]]; 
      break; 

     case kCGPathElementAddLineToPoint: // contains 1 point 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]]; 
      break; 

     case kCGPathElementAddQuadCurveToPoint: // contains 2 points 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]]; 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]]; 
      break; 

     case kCGPathElementAddCurveToPoint: // contains 3 points 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]]; 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]]; 
      [bezierPoints addObject:[NSValue valueWithCGPoint:points[2]]]; 
      break; 

     case kCGPathElementCloseSubpath: // contains no point 
      break; 
    } 
} 

Использование:

NSMutableArray *bezierPoints = [NSMutableArray array]; 
CGPathApply(circlePath.CGPath, bezierPoints, MyCGPathApplierFunc); 
+0

, но как я могу получить все элементы из круга? и какие точки следует вставлять внутри bezierPoints? –

+0

Вы должны использовать CGPathAddArc, проверьте этот ответ для получения дополнительной информации: http: //stackoverflow.com/questions/5183785/how-to-draw-a-circle-starting-at-the-top –

+0

@Paulo Furlan, или вы только что установили asOffset = true – Knight0fDragon

Смежные вопросы