我的情况是,我正在沿着拱门移动现有节点,并希望它在到达另一侧时停止。一个简单的比喻是,我想让一些东西沿着彩虹移动。
虽然我当前的代码确实执行了适当的椭圆形,但是它在我的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
来填充它以满足我的条件。
答案 0 :(得分:0)
所以我对基于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))
}
最后,使用时的外观:
如果我避免使用repeat
上的SKAction
,则它将与恰好位于我想要的位置的对象一起完成。
由于我不是SpriteKit的专家,所以我很想找出是否有更好的方法来解决这个问题。