好的,所以有一个很酷的小 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
您需要的只是路径本身,为此您可以使用UIBezierPath。 UIBezierPath 是一个objective-c 类,它允许您定义路径,然后可以在drawRect: 方法中的视图上绘制。它们也可以转换为CGPathRefs,然后可以跟一个节点。
所有圆弧都是圆的一部分,并且有一个UIBezierPath 的方法旨在定义圆弧:arcWithCenter:radius:startAngle:endAngle:clockwise:。
所以...假设您的节点位于 200,200 矩形中的 100,200 点)(即在 x 的中心但在 y 的顶部)。您希望此节点遵循从它所在的位置到点 0,100 的弧:
基本上你在这里所做的是将节点移动四分之一圆,如下所示:
在这种情况下,圆的半径为 100,0 度位于 3 点钟方向。另外值得注意的是,对于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];
就移动到弧中的不同位置而言,您可以将SKAction 与NSDictionary 之类的键相关联,然后在它们完成之前将其删除,从而终止操作。
对于点击时的电弧,您需要覆盖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是对二次曲线的简要说明。