如何实现SKNode沿半椭圆路径移动并到达终点后停止?
解决SKNode沿拱形路径移动并在终点停止的问题
我明白你的需求——要让橙色方块沿彩虹状的拱形移动到另一侧后停止,而不是绕椭圆循环回到起点。问题出在你用的UIBezierPath(ovalIn:)会创建闭合的椭圆路径,所以SKAction执行时会绕完整一圈回到原点。
咱们换个思路,直接用UIBezierPath手动构建开放的拱形路径,这样节点移动到终点就会自动停止。这里用二次贝塞尔曲线就能轻松实现彩虹拱效果,步骤如下:
解决方案代码
override func didMove(to view: SKView) { let box = SKSpriteNode(color: .orange, size: CGSize(width: 30, height: 30)) box.position = CGPoint(x: 30, y: frame.midY) // 将起点直接设为路径起始点 addChild(box) // 构建上拱形的开放路径 let path = UIBezierPath() // 移动到路径起点(左侧位置) path.move(to: CGPoint(x: 30, y: frame.midY)) // 添加二次贝塞尔曲线:控制点决定拱的高度,终点设为右侧目标位置 path.addQuadCurve(to: CGPoint(x: frame.width - 30, y: frame.midY), controlPoint: CGPoint(x: frame.midX, y: frame.midY + 50)) // 创建路径跟随动作,因为是开放路径,到达终点后自动停止 let action = SKAction.follow(path.cgPath, asOffset: false, orientToPath: false, speed: 250) box.run(action) }
关键细节解释
- 开放路径构建:用
move(to:)设定起点,addQuadCurve(to:controlPoint:)创建拱形——控制点的y坐标决定了拱的高度(这里设为midY + 50,你可以根据需求调高或调低),这样得到的路径是开放的,没有闭合,所以动作执行到终点就会停止。 - 起点对齐:我把方块的初始位置直接对齐到路径起点,避免了初始位置偏移的问题,你也可以根据场景需求调整起点坐标。
- 下半拱适配:如果需要向下拱的路径,只需要把控制点的y坐标改成
frame.midY - 50即可。
你提到的UIBezierPath(cgPath:)其实也能实现,但直接用UIBezierPath的二次贝塞尔曲线API更直观,不需要手动拼接CGPath的点,效率更高也更易维护。
内容的提问来源于stack exchange,提问作者CodeBender
相关产品推荐
相关产品推荐

