Ios 我想沿着半椭圆形路径移动SKNode

Ios 我想沿着半椭圆形路径移动SKNode,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我的场景是,我沿着拱门移动一个现有节点,并希望它在到达另一侧后停止。一个简单的类比是,我希望有东西沿着彩虹移动 虽然我当前的代码确实执行了一个适当的椭圆,但它会继续在y原点下返回到它的起点。我知道我可以更好地控制一个圆圈,让它停在我想停的地方,但是对于我的用例来说,一个圆圈路径将不起作用 我的代码的缩写版本是: override func didMove(to view: SKView) { let size = CGSize(width: frame.width - 60, heigh

我的场景是,我沿着拱门移动一个现有节点,并希望它在到达另一侧后停止。一个简单的类比是,我希望有东西沿着彩虹移动

虽然我当前的代码确实执行了一个适当的椭圆,但它会继续在y原点下返回到它的起点。我知道我可以更好地控制一个圆圈,让它停在我想停的地方,但是对于我的用例来说,一个圆圈路径将不起作用

我的代码的缩写版本是:

override func didMove(to view: SKView) {
    let size = CGSize(width: frame.width - 60, height: 100)
    let box = SKSpriteNode(color: .orange,
                           size: CGSize(width: 30, height: 30))
    box.position = CGPoint(x: frame.midX, y: frame.midY)
    addChild(box)
    let origin = CGPoint(x: 30, y: frame.midY)
    let rect = CGRect(origin: origin, size: size)
    let path = UIBezierPath(ovalIn: rect)
    let action = SKAction.follow(path.cgPath,
                                 asOffset: false,
                                 orientToPath: false,
                                 speed: 250)
    box.run(action)
}
上面的代码在运行时生成:

我的目标是让橙色的盒子在到达左边时停止


我已经浏览了各种UIBezierPath初始值设定项,另外一个看起来很有希望的是使用
UIBezierPath(cgPath:)
。理想情况下,我需要使用
cgPath
来填充它,以满足我的标准。

因此,我对基于
UIBezierPath(cgPath:)
的方法是正确的

对我来说,关键是使用问题中发布的代码运行,然后捕获
path
变量的内容,以便从中提取值。有了这些,我就可以构建一个硬编码的
CGPath
,然后使用它

override func didMove(to view: SKView) {
    let box = SKSpriteNode(color: .orange,
                           size: CGSize(width: 30, height: 30))
    box.position = CGPoint(x: frame.midX, y: frame.midY)
    addChild(box)
    let path = UIBezierPath()
    let start = CGPoint(x: 345, y: 383.5)
    let end = CGPoint(x: 30, y: 383.5)
    let controlPoint = CGPoint(x: 190, y: 533.5)
    path.move(to: start)
    path.addQuadCurve(to: end, controlPoint: controlPoint)
    let action = SKAction.follow(path.cgPath,
                                 asOffset: false,
                                 orientToPath: false,
                                 speed: 250)
    box.run(SKAction.repeatForever(action))
}
最后,它在使用时的外观:

如果我避开
SKAction
上的
repeat
,它将完成,对象将精确地位于我想要的位置


由于我不是SpriteKit方面的专家,我很想知道是否有更好的方法来实现这一点。

你不需要移动到终点,路径已经到了终点。虽然这确实有效,但您可能需要一条二次曲线。。。。addQuadCurve,控制点为中间xAlso,如果使用局部坐标(从0,0开始)并设置为offset=true,重复操作将变成跳跃效果@Knight0fDragon。我将答案更新为使用
addQuadCurve
。返回是因为我让它关闭了路径并删除了它。