如何在Swift中围绕其起始值上下移动SKSpriteNode?

我正在开发一款游戏,其中有一个SKSpriteNode。 我想,这个节点的位置一直在上下移动。 一开始,它应该具有y值,例如500。 那么它应该向下移动200 px(500 + 200 = 700)然后它应该向上移动400(700-400 = 300),因此它会像上下一样产生,一直在500 + 200到500-200之间移动。 我希望我解释说这是可以理解的。 首先,我如何获得此效果,其次,我在哪里输入? 我应该使用自定义function吗? 我用swift编程(newbie to swift)

我写了一些示例代码,您可以根据自己的需要进行调整:

首先,振荡计算需要π:

 // Defined at global scope. let π = CGFloat(M_PI) 

其次,扩展SKAction以便您可以轻松创建将使相关节点振荡的操作:

 extension SKAction { // amplitude - the amount the height will vary by, set this to 200 in your case. // timePeriod - the time it takes for one complete cycle // midPoint - the point around which the oscillation occurs. static func oscillation(amplitude a: CGFloat, timePeriod t: Double, midPoint: CGPoint) -> SKAction { let action = SKAction.customActionWithDuration(t) { node, currentTime in let displacement = a * sin(2 * π * currentTime / CGFloat(t)) node.position.y = midPoint.y + displacement } return action } } 

上面的displacement来自用于位移的简谐运动方程。 请看这里获取更多信息(它们的重新排列有点,但它是相同的等式)。

第三,将所有这些放在一起,在SKScene

 override func didMoveToView(view: SKView) { let node = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50)) node.position = CGPoint(x: size.width / 2, y: size.height / 2) self.addChild(node) let oscillate = SKAction.oscillation(amplitude: 200, timePeriod: 1, midPoint: node.position) node.runAction(SKAction.repeatActionForever(oscillate)) } 

如果你需要在x轴上振荡节点,我建议在oscillate方法中添加一个angle参数,并使用sincos来确定节点在每个轴上应该振荡的程度。

希望有所帮助!