Как заставить Sprite следовать кривой Безье

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

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

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
задан Tony_89 05 февр. '15 в 13:49
источник поделиться
1 ответ

Кривые Безье используются для создания гладкой кривой между двумя точками. Чтобы переместить путь слева направо, выберите начальную точку слева и выберите конечную точку справа. Две контрольные точки определяют форму пути, который следует принимать слева направо. Изменение параметров 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/

7
ответ дан rakeshbs 05 февр. '15 в 15:06
источник поделиться

Другие вопросы по меткам