SpriteKit - 在半圆拱中移动对象

时间:2015-02-22 08:47:43

标签: ios objective-c animation path sprite-kit

我对sprite kit比较新。我想要实现的目标;

  1. 我有一个放在屏幕中间的物体
  2. 当点击屏幕的左侧时,我希望物体以拱形方式向左弯曲。如果您想象对象位于钟面上的12处,向左按将使其动画到9点钟。
  3. 当向右敲击时,我希望物体移动到3点钟。
  4. 但是,如果对象已经拱起到9到12(10或11)之间的位置,并且我向右按,它将需要在路径上移动。
  5. 总之,我想要一条跨越9到3点的路径。当用户向左或向右轻击时,对象将沿着路径移动,直到用户放开按钮(屏幕的左侧或右侧)
  6. 如果我可以提供任何其他信息以帮助我们更清楚,请告知我们。

    一如既往,非常感谢任何回复:)

1 个答案:

答案 0 :(得分:8)

好的,所以有一个很酷的小SKAction(我确定你熟悉那个类),它允许SKSpriteNode遵循一条路径:

SKAction *move = [SKAction followPath:/*aPath*/ duration:1];
[myNode runAction:action];
// There's also a followPath:withSpeed: method which may be more suitable for you

您需要的只是路径本身,为此您可以使用UIBezierPathUIBezierPath是objective-c类,允许您定义路径,然后可以在drawRect:方法的视图上绘制。它们也可以转换为CGPathRef s,然后可以跟随一个节点。

所有弧都是圆的一部分,并且有一种UIBezierPath用于定义弧的方法:arcWithCenter:radius:startAngle:endAngle:clockwise:

所以......让我们假设你的节点在200,200的矩形中的点100,200处(即在x的中心,但在y的顶部)。您希望此节点遵循弧到它指向0,100:

的弧

enter image description here

基本上你在这里做的是将节点移动四分之一圆,如下所示:

enter image description here

在这种情况下,圆的半径为100,在3点钟位置发现0度。另外值得注意的是,UIBezierPath角度以弧度而非度数来衡量。要将度数转换为弧度,您可以使用以下简单公式:float radian = degree * M_PI / 180.0f;其中M_PI为pi。

因此,要创建从点100,200到0,100的路径并将其应用于SKAction,您可以执行此操作:

UIBezierPath *path = [UIBezierPath pathWithArcCenter:CGPointMake(100,100), radius:100 startAngle:90.0f * M_PI / 180.0f endAngle:180.0f * M_PI / 180.0f clockwise:NO];
SKAction *moveInArc = [SKAction followPath:path.CGPath duration:1];

就移动到弧线中间的不同位置而言,您可以将SKActionNSDictionary之类的关联关联,然后在它们完成之前删除它们以终止操作。

点击时进行电弧放电,您需要覆盖touchesBegan:withEvent:

希望这能让你开始走上正确的道路。 (双关打算...)

编辑:

好的,所以上面的代码定义了一个像圆形切片一样绘制圆形切片的路径,但是,你可以使用UIBezierPath方法

- (void)addCurveToPoint:(CGPoint)endPoint
          controlPoint1:(CGPoint)controlPoint1
          controlPoint2:(CGPoint)controlPoint2

- (void)addQuadCurveToPoint:(CGPoint)endPoint
               controlPoint:(CGPoint)controlPoint

后者可能是最适合您的。 Here is a link to the docs.

您的代码看起来像这样:

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:node.positon];
[path addQuadCurveToPoint:destination controlPoint:control];

SKAction *move = [SKAction followPath:path.CGPath duration:1];
[node runAction:move];

要计算控制点,你可以试验直到你得到所需的效果(也许是一个直角三角形,其中从节点到目的地的线是斜边,控制点是直角的点),或here是二次曲线的简要说明。