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

时间:2015-05-11 20:31:44

标签: ios swift sprite-kit skspritenode

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

1 个答案:

答案 0 :(得分:4)

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

首先,振荡计算需要π:

// 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来自用于位移的简谐运动方程。有关详细信息,请参阅here(它们的重新排列有点,但它的方程式相同)。

第三,将所有内容整合在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轴上振荡节点,我建议在angle方法中添加oscillate参数,并使用sincos来确定节点应在每个轴上振荡多少。

希望有所帮助!