SKNodeをロケットのように震わせる

ロケットを発射したときのように、ノードをブルブル震えさせつつ、けれども元々の場所は維持するアクションはどうやって作ったらいいんだろう、と悩んでいました。 調べたところ、ここで紹介されている方法がなかなか良いことがわかりました。Swift 3で書くとこんな感じになります。

let duration   = 0.5 // 繰り返しの単位
let amplitudeX = 5.0  // X方向への変化(±2.5pt)
let amplitudeY = 3.0  // Y方向への変化(±1.5pt)

let numShakes = Int(duration * 15.0) // 4フレーム×2を揺れの周期とする
var actions = [SKAction]()
for _ in 0 ..< numShakes {
    // 「行って」「戻る」を1アクションとして扱う
    let moveX = Double(arc4random_uniform(UInt32(amplitudeX))) - amplitudeX / 2
    let moveY = Double(arc4random_uniform(UInt32(amplitudeY))) - amplitudeY / 2
    let shakeAction = SKAction.moveBy(x: CGFloat(moveX),
                                      y: CGFloat(moveY),
                                      duration: 8.0/60)
    shakeAction.timingMode = .easeOut
    actions.append(contentsOf: [shakeAction, shakeAction.reversed()])
}
// アクションの実行。actions単位の繰り返しをずっと続ける
let sequence = SKAction.sequence(actions)
run(SKAction.repeatForever(sequence))

少し動いてから、元に戻るという2アクションを1セットにして、それを何回も繰り返すという処理です。

参考サイト

coderwall.com