2017-03-20 60 views
0

我有一個移動背景,其是1500 x 600個像素不斷使用此代碼垂直向下移動屏幕:Swift Game Scene隨時間改變垂直移動背景?

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 


    } 

我現在要一個新的背景後的時間,得到x量來在屏幕上覺得玩家正在進入遊戲的另一部分。

我可以把這段代碼放到一個函數中,並在20秒後用NSTimer觸發它,但將新bg的起始位置改爲離屏?

回答

1

repeatForever操作的麻煩是你不知道它們在某個時刻的位置。 NSTimers沒有你想要的那麼精確,所以使用定時器可能會錯過正確的時間或根據渲染速度和幀速率過早跳轉。

我建議用bgAnimation替換您的moveBGForever作爲您的移動&移位操作的順序。然後,當您運行bgAnimation動作時,可以使用{self.cycleComplete = true}的完成塊運行它。 cycleComplete將是一個布爾變量,指示動作序列是否完成。在你的場景更新方法中,你可以檢查這個變量是否爲真,如果是,你可以再次運行序列動作。不要忘記將cycleComplete var重置爲false。

也許它聽起來更復雜,但是可以控制是否要運行一個循環。如果沒有,那麼你可以改變紋理並再次運行循環。

或者,您可以保持原樣,只有在確定精靈位於可見區域之外後才更改紋理。它的Y位置是>視圖大小高度。

在SpriteKit中,您可以對完成塊使用等待操作。這比使用NSTimer更直接。

所以,要回答你的問題 - 當在屏幕上使用動作移動精靈時,你不應該隨時更改精靈的位置 - 這是動作的作用。您只需確保在位置不在屏幕上時更新紋理。到時候,顯然有些精靈會顯示出來,所以你不能同時改變所有3的紋理。爲此,您可能需要一個輔助變量來檢查更新週期(如上所述),並在時間正確時替換紋理(sprite Y pos is off-screen)。