2017-03-23 59 views
2

我已經設置播放/暫停按鈕gameLayer取消暫停來啓動應用程序後 - 在這裏:How to prevent run SKAction on paused scene (after unpaused), texture of node not change after pause/unpause scene暫停層從背景

一切工作正常,但我無奈與後臺程序。當我暫停gameLayer和應用程序去背景或當我鎖定設備時,應用程序前往後,遊戲層會自動取消暫停。如何防止這一點?

謝謝!

+1

只需在場景中偵聽UIApplicationDidBecomeActiveNotification並採取適當的操作(暫停gameLayer)即可。如果你仍然堅持,讓我知道,我會爲你寫一個答案。 – Whirlwind

+0

我檢查蘋果文檔,發現只有'靜態讓UIApplicationDidBecomeActive:NSNotification.Name',但我不知道如何正確使用它。例子會很棒!謝謝! –

回答

2

因此,這是對我工作:

import SpriteKit 
import GameplayKit 

class GameScene: SKScene { 

    var gameLayer = SKNode() 

    override func didMove(to view: SKView) { 
     NotificationCenter.default.addObserver(self, 
               selector: #selector(GameScene.pause), 
               name: .UIApplicationDidBecomeActive, 
               object: nil) 
     let moveUp = SKAction.moveBy(x: 0, y: 100, duration: 2) 
     let sequence = SKAction.sequence([moveUp, moveUp.reversed()]) 
     let loop = SKAction.repeatForever(sequence) 

     let sprite = SKSpriteNode(color: .purple, size: CGSize(width: 100, height: 100)) 

     addChild(gameLayer) 
     gameLayer.addChild(sprite) 

     sprite.run(loop) 
    } 

    func pause(){ 

     gameLayer.speed = 0 
    } 

    override func willMove(from view: SKView) { 
     super.willMove(from: view) 

     NotificationCenter.default.removeObserver(self, 
                name: .UIApplicationDidBecomeActive, 
                object: nil) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

     gameLayer.speed = gameLayer.speed == 0 ? 1 : 0 
    } 
} 

我還沒有來得及測試更多,但我期待這樣的事情:

func pause(){ 
     gameLayer.isPaused = true 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     gameLayer.isPaused = !gameLayer.isPaused 
    } 

會的工作,但令人驚訝的它不是(在執行pause()方法後節點繼續移動)。我真的不知道這是一個錯誤還是一個功能:)但恕我直言,我會說這是一個錯誤。無論如何,你可以使用速度屬性來達到你想要的。只需複製並粘貼此代碼即可瞭解其工作原理。

+0

也許像@ Knight0fDragon或@AlessandroOrnano等人可能會幫助解釋爲什麼'isPaused'在這種情況下不起作用,雖然......也許我只是因爲簡短的測試而錯過了一些東西,但它看起來像一個錯誤。 – Whirlwind

+0

另一方面,由於'UIApplicationDidBecomeActive'通知是在應用程序開始時觸發的,所以'gameLayer'將從頭開始暫停。所以你必須點擊屏幕以取消暫停將精靈上下移動的動作...... – Whirlwind

+0

'isPaused'行絕對有效我複製了你的代碼,它按預期工作。奇怪的事情,但通知不會發射 –