2016-02-21 3 views
7

Ho un pulsante per mettere in pausa il gioco sul mio codice. Quello che voglio è che mettendo in pausa il gioco con quel pulsante faccia apparire un messaggio che dice "In pausa". Tuttavia, poiché la scena è in pausa, il messaggio non viene visualizzato.SpriteKit: avvia azione mentre la scena è in pausa

Quello che ho adesso è un SKLabelNode con l'alpha su 0.0 all'inizio e quando l'utente mette in pausa il gioco, passa a 1.0 con fadeInWithDuration(). Quindi, quando l'utente preme di nuovo il pulsante, torna a 0.0 con fadeOutWithDuration(). Il problema è che SKAction con fadeInWithDuration() non viene eseguito quando la scena è in pausa.

Come posso ottenere questo risultato?

risposta

7

Il modo migliore, che Apple utilizza anche in "DemoBots", è quello di creare un nodo del mondo che si interrompe al posto della scena.

creare una proprietà worldNode

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

aggiungerlo alla scena in didMoveToView

addChild(worldNode) 

e poi aggiungere tutto il necessario pausa al worldNode. Questo include azioni che normalmente vengono eseguiti dalla scena (ad es. Timer, nemico la deposizione delle uova, ecc)

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

che nella vostra pausa func dici

worldNode.isPaused = true 
physicsWorld.speed = 0 

e nel curriculum

worldNode.isPaused = false 
physicsWorld.speed = 1 

È anche possibile aggiungere un controllo extra nella funzione di aggiornamento se si dispone di elementi che si desidera ignorare in pausa.

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

In questo modo è molto più facile per aggiungere la vostra etichetta in pausa o altro utente quando il gioco è in pausa, perché non si è effettivamente in pausa la scena.Puoi anche eseguire qualsiasi azione tu desideri, a meno che quell'azione non venga aggiunta al worldNode o ad un figlio di worldNode.

Spero che questo aiuti

+0

Mi hai salvato, amico! Apprezzo questa soluzione poiché ha risolto un altro problema di pausa che ho avuto! sembra che fosse perché stavo facendo una pausa dalla radice ... stava causando il ritardo della fisica quando non era possibile ... ora con la soluzione SKNode tutto funziona perfettamente! – msqar

1

Quindi si desidera mettere in pausa il gioco AFTER l'esecuzione dell'azione è stata completata.

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

Una soluzione rapida sarebbe quella di mettere in pausa il gioco dopo appare la SKLabelNode sullo schermo:

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

Un'altra opzione sarebbe quella di mescolare UIKit e SpriteKit e informare il ViewController schiena che ha bisogno di mostrare questa etichetta .

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

Invece di mettere in pausa la scena, è possibile sovrapporre alcuni nodi vostra scena come questa

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

Poi, quando si desidera mettere in pausa il gioco, si mette in pausa solo SKNode 1.

Questo permette nodo SKNode 2 per continuare a correre, in modo da poter fare cose come avere le animazioni in corso, e avere un pulsante che disfa la scena per te, senza la necessità di aggiungere alcuni oggetti non Sprite Kit nel mix.

0

vorrei aggiungere l'etichetta con

self.addChild(nameOfLabel) 

e poi mettere in pausa il gioco con

self.scene?.paused = true 

Questo dovrebbe andare tutti nella parte di se pauseButton viene toccato della vostra codice.