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

Posted

技术标签:

【中文标题】如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?【英文标题】:How do I move a SKSpriteNode up and down around its starting value in Swift? 【发布时间】:2015-05-11 20:31:44 【问题描述】:

我目前正在开发一款游戏,其中有一个 SKSpriteNode。我想要,这个节点的位置一直上下移动。一开始,它应该有 y 值,例如500 。然后它应该向下移动 200 像素(500+200=700),然后它应该向上移动 400 像素(700-400=300),所以它会像上下一样创建,一直在 500+200 和 500-200 之间移动.我希望我解释它可以理解。首先,我如何获得这种效果,其次,我在哪里输入它?我应该使用自定义函数吗?我正在用 swift 编程(新手到 swift)

【问题讨论】:

如果我是你,我会研究正弦波,然后可能会使用自定义 SKAction 来实现。 此视频可能有助于了解总体思路。 youtube.com/watch?v=e2qHv0qlC_g Sine Wave Motion In SpriteKit的可能重复 【参考方案1】:

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

首先,你需要 π 来进行振荡计算:

// 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 轴上振荡节点,我建议在 oscillate 方法中添加一个 angle 参数并使用 sincos 来确定节点应该振荡多少每个轴。

希望有帮助!

【讨论】:

非常感谢!只是为了确保它有效,我是否仍然能够使用此方法识别我的节点和其他节点之间的冲突? 我假设是因为它只是使用SKActions,但是我自己没有在这种情况下测试过它。很高兴知道我能帮上忙! :)

以上是关于如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?的主要内容,如果未能解决你的问题,请参考以下文章

wpf在xaml里做动画(移动),如何设定相对已知值的From起始值

动画:将 UIView 在屏幕上上下移动高度 - SWIFT

将发射器节点添加到 sks 文件并使用它 - XCode 6.0 + swift

添加分享按钮 - Swift

如何在swift中找到最近的spritenode到场景的底部

如何根据视图高度值的变化上下移动UIScrollView?