2015-02-05 3 views
7

Im довольно новичок в объективе-c и наборе спрайтов, но я уже давно разрабатывал игры. Im в настоящее время работает над 2-й игрой, и у меня вражеские корабли движутся справа налево на экране. Я следил за учебниками для разных частей своей игры, а затем добавлял туда, где это необходимо. Я нашел учебник, в котором враги игры следуют по пути безье, и мне удалось реализовать это в моей игре, однако, поскольку я новичок в кривых Безье, я не совсем понимаю их, и алгоритм делает мои спрайты перемещенными сверху вниз но мне нужно, чтобы они шли слева направо.как сделать Sprite следовать кривой Безье

Я включил фрагмент кода, который я использовал, чтобы добавить кривую Безье к моим спрайтам, любые предложения о том, как я могу заставить их перемещаться вправо, а не сверху вниз.

CGMutablePathRef cgpath = CGPathCreateMutable(); 

     float xStart = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float xEnd = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp1X =[self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp1y = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.height]; 
     float cp2x = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp2Y = [self getRandomNumberBetween:0 to:cp1y]; 

     CGPoint s = CGPointMake(xStart, 1024.0); 
     CGPoint e = CGPointMake(xEnd, -100); 
     CGPoint cp1 = CGPointMake(cp1X, cp1y); 
     CGPoint cp2 = CGPointMake(cp2x, cp2Y); 
     CGPathMoveToPoint(cgpath, NULL, s.x, s.y); 
     CGPathAddCurveToPoint(cgpath, NULL, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y); 

     SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5]; 

    CGPoint location = CGPointMake(-self.frame.size.width-asteroid.size.width, randY); 

     SKAction *moveAction = [SKAction moveTo:location duration:randDuration]; 
     SKAction *doneAction = [SKAction runBlock:(dispatch_block_t)^(){ 

      asteroid.hidden = YES; 
     }]; 

     SKAction *moveAsteroidActionWithDone = [SKAction sequence:@[enemyCurve,moveAction, doneAction]]; 

Благодарим за помощь и предложения.

ответ

7

Кривые Безье используются для создания гладкой кривой между двумя точками. Чтобы переместить путь слева направо, выберите начальную точку слева и выберите конечную точку справа. Две контрольные точки определяют форму пути, который следует принимать слева направо. Изменение startpoint и endpoint в следующем коде будет контролировать, где начинается кривая безье и где она заканчивается. Изменение control points меняет форму кривой. Вы можете видеть это с помощью прилагаемого GIF.

CGMutablePathRef cgpath = CGPathCreateMutable(); 

CGPoint startingPoint = CGPointMake(50, 100); 

CGPoint controlPoint1 = CGPointMake(160, 250); 
CGPoint controlPoint2 = CGPointMake(200, 140); 

CGPoint endingPoint = CGPointMake(303, 100); 


CGPathMoveToPoint(cgpath, NULL, startingPoint.x, startingPoint.y); 
CGPathAddCurveToPoint(cgpath, NULL, controlPoint1.x, controlPoint1.y, 
         controlPoint2.x, controlPoint2.y, 
         endingPoint.x, endingPoint.y); 


SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5]; 

[enemy runAction:[SKAction sequence:@[[SKAction waitForDuration:1],enemyCurve]]]; 

enter image description here

P0 и P3 являются начальные и конечные точки и P1 и P2 являются контрольные точки.

Проверьте информацию, чтобы больше узнать о кривых Безье. http://www.jasondavies.com/animated-bezier/

+1

Это то, что я искал, спасибо за хорошее объяснение, которому я смог реализовать это в своей игре, и он работает. –

+0

Если вы знаете, как бы у меня было лицо спрайта в направлении его перемещения, я устанавливал 'orientToPath: YES', но он просто смотрел на конечную точку кривой, любые предложения о том, как я могу заставить ее указать в направление его путешествия? Еще раз спасибо –