2016-02-21 4 views
7

Ich habe eine Taste, um das Spiel auf meinem Code zu pausieren. Was ich möchte, ist, dass das Pausieren des Spiels mit dieser Taste eine Nachricht mit der Meldung "Pausiert" erscheint. Da die Szene jedoch pausiert ist, wird die Nachricht nicht angezeigt.SpriteKit: Aktion ausführen, während die Szene pausiert ist

Was ich gerade habe, ist ein SKLabelNode mit dem Alpha auf 0.0 am Anfang und wenn der Benutzer das Spiel pausiert, ändert es sich mit fadeInWithDuration() zu 1.0. Wenn der Benutzer dann erneut auf die Schaltfläche klickt, wird mit fadeOutWithDuration() wieder 0.0 angezeigt. Das Problem ist, dass die SKAction mit fadeInWithDuration() nicht ausgeführt wird, wenn die Szene pausiert ist.

Wie konnte ich das erreichen?

Antwort

7

Der beste Weg, einen Apple auch in "DemoBots" zu verwenden, besteht darin, einen Weltknoten zu erstellen, den Sie statt der Szene anhalten.

erstellen worldNode Eigenschaft

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

es zu der Szene in didMoveToView

hinzufügen
addChild(worldNode) 

und als fügt alles, was Sie zum worldNode pausierten müssen. Dazu gehören Maßnahmen, die von der Szene normal ausgeführt werden (z. B. Timer, Laichen Feind usw.)

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

als in Ihrer Pause func Sie

worldNode.isPaused = true 
physicsWorld.speed = 0 

sagen und in resume

worldNode.isPaused = false 
physicsWorld.speed = 1 

Sie können auch eine zusätzliche Überprüfung in Ihrer Update-Funktion hinzufügen, wenn Sie Dinge haben, die Sie ignorieren möchten, wenn Sie pausiert sind.

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

diese Weise ist es viel einfacher ist, Ihr pausiert Etikett oder eine andere Benutzeroberfläche hinzuzufügen, wenn Ihr Spiel pausiert ist, weil Sie nicht wirklich die Szene angehalten haben.Sie können auch eine beliebige Aktion ausführen, es sei denn, diese Aktion wird dem worldNode oder einem Kind von worldNode hinzugefügt.

hoffe, das hilft

+0

Sie haben mich gerettet, Mann! Ich schätze diese Lösung, da sie ein weiteres Pausenproblem gelöst hat, das ich hatte! Es sieht so aus, als ob ich von der Wurzel pausiert habe ... es verursachte Physik-Verzögerung, wenn man nicht pausiert ... jetzt funktioniert mit der SKNode-Lösung alles perfekt! – msqar

1

Sie möchten also das Spiel NACH pausieren die Aktion wurde abgeschlossen.

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

Eine schnelle Abhilfe wäre das Spiel zu unterbrechen, nachdem der SKLabelNode auf dem Bildschirm erscheint:

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

Eine andere Möglichkeit wäre UIKit und SpriteKit zu mischen und das Viewcontroller informieren zurück, dass sie dieses Etikett muss zeigen .

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

Statt die Szene der Pause, könnte man einige Knoten Szene wie diese

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

Dann Schicht, wenn Sie das Spiel pausieren möchten, pausieren Sie nur SKNode 1.

Dies ermöglicht Knoten SKNode 2, um fortzufahren, so dass Sie Dinge wie Animationen machen können, und einen Knopf haben, der die Szene für Sie pausiert, ohne dass Sie etwas Nicht-Sprite-Kit-Objekt in den Mix einfügen müssen.

0

ich das Etikett mit

self.addChild(nameOfLabel) 

hinzufügen würde und pausieren dann das Spiel mit

self.scene?.paused = true 

Dies sollte alle gehen in die, wenn pausebutton berührt Teil Ihrer Code.

Verwandte Themen