2016-02-21 23 views
7

私のコードでゲームを一時停止するボタンがあります。私が望むのは、そのボタンでゲームを一時停止すると、「一時停止」と表示されるというメッセージが表示されます。ただし、シーンが一時停止しているため、メッセージは表示されません。SpriteKit:シーンが一時停止中にアクションを実行します。

今私が持っているのは、最初0.0のアルファを持つSKLabelNodeで、ユーザがゲームを一時停止すると、fadeInWithDuration()で1.0に変わります。ユーザーがボタンをもう一度押すと、fadeOutWithDuration()で0.0に戻ります。問題は、シーンが一時停止しているときにfadeInWithDuration()を使用したSKActionが実行されないことです。

これをどのように達成できますか?

答えて

7

"DemoBots"でAppleが使用する最善の方法は、シーンの代わりに一時停止するワールドノードを作成することです。

didMoveToView

addChild(worldNode) 

、あなたがworldNodeに一時停止に必要なすべてを追加以上でシーンに追加

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

worldNodeプロパティを作成します。あなたは

worldNode.isPaused = true 
physicsWorld.speed = 0 

と再開

worldNode.isPaused = false 
physicsWorld.speed = 1 

で言うfuncをこれは、通常、シーンによって実行されるアクション(例えばタイマ、敵など産卵)あなたの一時停止に比べ

worldNode.addChild(someNode) 
worldNode.run(someSKAction) 

を含み一時停止時に無視したいものがある場合は、更新機能に追加のチェックを追加することもできます。

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

それはあなたが実際のシーンを一時停止していないので、あなたのゲームが一時停止されたときに、あなたの一時停止の標識または他のUIを追加する方がはるかに簡単ですこの方法です。そのアクションがworldNodeまたはworldNodeの子に追加されない限り、任意のアクションを実行することもできます。

希望これは

+0

あなたは私を救った!私はそれが別の一時停止の問題を解決して以来、私はこの解決に感謝!それは私がルートから休止していたためだった...それは物理的な遅れを引き起こしていた.PNNodeソリューションですべてが完璧に機能するようになりました! – msqar

1

ゲームを一時停止したいので、の後にアクション実行が完了しました。

class GameScene: SKScene { 

    let pauseLabel = SKLabelNode(text: "Paused") 

    override func didMoveToView(view: SKView) { 
     pauseLabel.alpha = 0 
     pauseLabel.position = CGPoint(x: CGRectGetMaxY(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(pauseLabel) 
    } 


    func pause(on: Bool) { 
     switch on { 
     case true: pauseLabel.runAction(SKAction.fadeInWithDuration(1)) { 
      self.paused = true 
     } 
     case false: 
      self.paused = false 
      pauseLabel.runAction(SKAction.fadeOutWithDuration(1)) 
     } 
    } 
} 
2

迅速な回避策がSKLabelNodeが画面に表示された後、ゲームを一時停止するには、次のようになります。

let action = SKAction.fadeOutWithDuration(duration) 
runAction(action) { 
    // Pause your game 
} 

別のオプションは、UIKitのとSpriteKitベースを混ぜ、それはこのラベルを表示する必要があるとのViewControllerをバックに通知することです。

class ViewController: UIViewController { 
    var gameScene: GameScene! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     gameScene = GameScene(...) 
     gameScene.sceneDelegate = self 
    } 
} 

extension ViewController: GameSceneDelegate { 
    func gameWasPaused() { 
     // Show your Label on top of your GameScene 
    } 
} 

protocol GameSceneDelegate: class { 
    func gameWasPaused() 
} 

class GameScene: SKScene { 
    weak var sceneDelegate: GameSceneDelegate? 

    func pauseGame() { 
     // Pause 
     // ... 
     sceneDelegate?.gameWasPaused() 
    } 
} 
2

代わりにシーンを一時停止すると、あなたがゲームを一時停止したいとき、あなたはこれができる唯一のSKNode 1.

一時停止し、その後、この

SKScene 
|--SKNode 1 
| |-- ... <--place all scene contents here 
|--SKNode 2 
| |-- ... <--place all overlay contents here 

のようないくつかのノードをあなたのシーンをレイヤー可能性ノードSKNode 2を実行し続けると、アニメーションのようなことができ、Sprite Kit以外のオブジェクトをミックスに追加する必要はなく、シーンのポーズを解除するボタンがあります。

0

を助け、私は

self.addChild(nameOfLabel) 

にラベルを追加し、その後、これは、すべてpauseButtonがあなたの部分をタッチした場合には行くべき

self.scene?.paused = true 

でゲームを一時停止しますコード。

関連する問題