我同意@Gord,我认为SKAction
这是最好的方法。但是,当您可以使用以下函数时,无需近似正弦曲线:sin
功能。
首先,您需要 π,因为它对于计算很有用:
// Defined at global scope.
let π = CGFloat(M_PI)
其次,延长SKAction
(在 Objective-C 中,这将通过类别来完成)轻松创建SKAction
使相关节点振荡:
extension SKAction {
static func oscillation(amplitude a: CGFloat, timePeriod t: CGFloat, midPoint: CGPoint) -> SKAction {
let action = SKAction.customActionWithDuration(Double(t)) { node, currentTime in
let displacement = a * sin(2 * π * currentTime / t)
node.position.y = midPoint.y + displacement
}
return action
}
}
在上面的代码中:amplitude
是振荡的高度;timePeriod
是一个完整周期的时间,并且midPoint
是振荡发生的点。公式为displacement
来自方程简谐振动.
第三,将所有这些放在一起。您可以结合SKAction.oscillation
行动和SKAction.moveByX
使精灵沿着曲线路径移动。
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
let node = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50))
node.position = CGPoint(x: 25, y: size.height / 2)
self.addChild(node)
let oscillate = SKAction.oscillation(amplitude: 200, timePeriod: 1, midPoint: node.position)
node.runAction(SKAction.repeatActionForever(oscillate))
node.runAction(SKAction.moveByX(size.width, y: 0, duration: 5))
}
}