うまい具合に背景を一定時間で動かすアルゴリズム
適当な時間や距離で背景を動かすと思い通りに動かない場合があります。そのような場合は画像の大きさを割り算した値を時間とするとうまくフィットするかと思います。
//背景のインスタンスを用意 let sky = SKTexture(imageNamed: "sky") sky.filteringMode = .Nearest //重要なとこ! let moveSkyAnim = SKAction.moveByX(-sky.size().width, y: 0.0, duration: NSTimeInterval(land.size().width / 100.0)) //動かし終わった画像を最初の位置に戻すためのもの let resetSkyAnim = SKAction.moveByX(sky.size().width, y: 0.0, duration: 0.0) let repeatForeverSkyAnim = SKAction.repeatActionForever(SKAction.sequence([moveSkyAnim, resetSkyAnim])) //インスタンスを作成 let sprite = SKSpriteNode(texture: sky) sprite.runAction(repeatForeverLandAnim)
詳しく説明
let moveSkyAnim = SKAction.moveByX(-sky.size().width, y: 0.0, duration: NSTimeInterval(land.size().width / 100.0))
SKAction.moveByX(ノードのx座標に加えるxの大きさ, y: 0.0, duration: どのくらいの時間間隔で動くか)
つまりこのコードでは今いる場所からテクスチャ(画像)の横幅大きさ大きさ分左に動く(値がマイナスなので左)。時間間隔は1秒に画像の1/100の大きさ進む。という指示をインスタンス化したもの。
1秒間に1/100ずつ進む画像を想像してみてください。
//動かし終わった画像を最初の位置に戻すためのもの let resetSkyAnim = SKAction.moveByX(sky.size().width, y: 0.0, duration: 0.0)
SKAction.moveByX(ノードのx座標に加えるxの大きさ, y: 0.0, duration: どのくらいの時間間隔で動くか)
つまりこのコードでは今いる場所からテクスチャ(画像)の横幅大きさ大きさ分右に動く(値がプラスなので右)。時間間隔は0秒。という指示をインスタンス化したもの。
let repeatForeverSkyAnim = SKAction.repeatActionForever(SKAction.sequence([moveSkyAnim, resetSkyAnim]))
上記の二つのアニメーションを無限に繰り返す。
//インスタンスを作成 let sprite = SKSpriteNode(texture: sky) sprite.runAction(repeatForeverLandAnim)
ノードを作り、アニメーションをノードにくっつける。
以上です。
ちょっと一言
個人差はあるが、実行結果を見るだけよりも、どういう動作になるかを想像してからの方が記憶に残りやすい