在圈中,暂停和反转动画SKSpriteNode?

时间:2014-09-28 21:40:40

标签: ios sprite-kit

我正在尝试在圆形路径中移动SKSpriteNode,暂停该动画,然后从停止的位置将其反转。

这是我到目前为止所拥有的。

    CGPathRef circle = CGPathCreateWithEllipseInRect(CGRectMake(self.frame.size.width/2-75,self.frame.size.height/2-75,150,150), NULL);
    self.circlePathActionClockwise = [SKAction followPath:circle asOffset:NO orientToPath:YES duration:5.0];
    self.circlePathActionClockwise = [SKAction repeatActionForever:self.circlePathActionClockwise];

    [self.ball runAction:self.circlePathActionClockwise];
    self.ball.speed = 1.0;

这将球打成了一个圆圈。然后当我想暂停和倒退时,我试试:

    [self.ball runAction:[self.circlePathActionClockwise reversedAction]];
    self.ball.speed = 1.0;

这会使动画反转,但它不会从停止的位置开始。相反,它认为它是一个新动画并从头开始。

我有没有办法从self.ball的当前位置开始行动?

非常感谢!

1 个答案:

答案 0 :(得分:2)

反转循环路径后面的精灵方向的步骤是

  1. 计算停止点处精灵的角度(参见图1中的点 a 和角度 theta
  2. 创建一个以角度 theta
  3. 开头的新圆形路径
  4. 以相反方向执行操作
  5. enter image description here

    图1 。跟随逆时针圆形路径的精灵

    以下是如何执行此操作的示例:

    第1步:根据精灵的当前位置计算新路径的起始角度。

    - (CGFloat) angleOnCircleWithPosition:(CGPoint)position andCenter:(CGPoint)center
    {
        CGFloat dx = position.x - center.x;
        CGFloat dy = position.y - center.y;
    
        return atan2f(dy, dx);
    }
    

    步骤2:根据中心点和半径创建圆形路径。创建从指定角度开始的路径(以弧度表示)。

    - (CGPathRef) circlePathRefWithCenter:(CGPoint)center radius:(CGFloat)radius andStartingAngle:(CGFloat)startAngle
    {
        CGMutablePathRef circlePath = CGPathCreateMutable();
        CGPathAddRelativeArc(circlePath, NULL, center.x, center.y, radius, startAngle, M_PI*2);
        CGPathCloseSubpath(circlePath);
        return circlePath;
    }
    

    您需要声明以下实例变量:

    BOOL clockwise;
    SKSpriteNode *sprite;
    CGFloat circleRadius;
    CGPoint circleCenter;
    

    第3步:当用户点按屏幕时,反转精灵的方向。它假定您已创建一个精灵并将其添加到场景中并设置圆弧路径的半径和中心。

    - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [sprite removeActionForKey:@"circle"];
        CGFloat angle = [self angleOnCircleWithPosition:sprite.position andCenter:circleCenter];
        CGPathRef path = [self circlePathRefWithCenter:circleCenter radius:circleRadius andStartingAngle:angle];
        SKAction *followPath = [SKAction followPath:path asOffset:NO orientToPath:YES duration:4];
        if (clockwise) {
            [sprite runAction:[SKAction repeatActionForever:followPath] withKey:@"circle"];
        }
        else {
            [sprite runAction:[[SKAction repeatActionForever:followPath] reversedAction] withKey:@"circle"];
        }
        // Toggle the direction
        clockwise = !clockwise;
    }