如何在 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
参数并使用 sin
和 cos
来确定节点应该振荡多少每个轴。
希望有帮助!
【讨论】:
非常感谢!只是为了确保它有效,我是否仍然能够使用此方法识别我的节点和其他节点之间的冲突? 我假设是因为它只是使用SKAction
s,但是我自己没有在这种情况下测试过它。很高兴知道我能帮上忙! :)以上是关于如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?的主要内容,如果未能解决你的问题,请参考以下文章
wpf在xaml里做动画(移动),如何设定相对已知值的From起始值
动画:将 UIView 在屏幕上上下移动高度 - SWIFT
将发射器节点添加到 sks 文件并使用它 - XCode 6.0 + swift