如何在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
参数,并使用sin
和cos
来确定节点在每个轴上应该振荡的程度。
希望有所帮助!