You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:04:30