2017-03-20 6 views
0

私は1500×600個のピクセルで、常にこのコードを使用して、画面下に垂直に移動させる移動背景があります。私は今与える時間のx量の後に画面上に来て新しい背景をしたいスウィフトゲームのシーンは、時間とともに垂直に動く背景を変更しますか?

let bgTexture = SKTexture(imageNamed: "bg.png") 
    let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4) 
    let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0) 
    let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 

    var i: CGFloat = 0 

    while i < 3 { 

     bg = SKSpriteNode(texture: bgTexture) 
     bg.position = CGPoint(x: self.frame.midX, y: bgTexture.size().height * i) 
     bg.size.width = self.frame.width 
     bg.zPosition = -2 

     bg.run(moveBGForever) 
     self.addChild(bg) 

     i += 1 


    } 

をプレイヤーがゲームの別の部分に移動していると感じる。

このコードを関数に入れて、NSTimerを使って20秒後にトリガすることはできますが、新しいbgの開始位置をオフスクリーンに変更できますか?

答えて

1

repeatForeverアクションの問題は、特定の瞬間にどこにいるのかわからないことです。 NSTimersはあなたが望むほど精密ではないので、タイマーを使用すると、レンダリング速度やフレームレートに応じて、適切な時間が間に合わないか、早すぎることがあります。

私はあなたのmoveBGForeverをあなたの移動&シフトアクションのシーケンスとしてbgAnimationに置き換えることをお勧めします。次に、bgAnimationアクションを実行すると、{self.cycleComplete = true}の完了ブロックで実行されます。 cycleCompleteは、アクションシーケンスが完了したかどうかを示すboolean変数です。シーン更新メソッドでは、この変数が真であるかどうかを確認することができます。そうであれば、シーケンスアクションをもう一度実行することができます。 cycleComplete varをfalseにリセットすることを忘れないでください。

おそらくもっと複雑に聞こえるかもしれませんが、もう1回サイクルを実行するかどうかを制御できます。そうでない場合は、テクスチャを変更してサイクルを再度実行できます。

スプライトが可視領域外にあることを確認した後で、そのままにしてテクスチャを変更することもできます。そのYの位置は、>表示サイズの高さです。

SpriteKitでは、完了ブロックで待機アクションを使用できます。これは、NSTimerを使用するよりも簡単です。

質問に答えるには、スプライトを画面上で動かすためのアクションを使用するときは、いつでもスプライトの位置を変更しないでください。これがアクションの動作です。位置がオフスクリーンのときは、テクスチャを更新する必要があります。時間が来たら明らかにスプライトの一部が表示されるので、同時に3つのテクスチャを変更することはできません。そのためには、上記のように更新サイクルをチェックし、時刻が正しいときにテクスチャを置き換えるためにヘルパー変数が必要な場合があります(スプライトY posはオフスクリーンです)。

関連する問題