2016-02-21 10 views
7

Mam przycisk, aby wstrzymać grę na moim kodzie. Chcemy wstrzymać grę za pomocą tego przycisku i pojawi się komunikat "Wstrzymany". Ponieważ jednak scena jest wstrzymana, komunikat nie pojawia się.SpriteKit: uruchom akcję, gdy scena jest zatrzymana

To, co mam teraz, to SKLabelNode z alfa na 0.0 na początku i kiedy użytkownik przerwie grę, zmieni się na 1.0 z fadeInWithDuration(). Następnie, gdy użytkownik ponownie naciśnie przycisk, zmienia się ponownie na 0.0 przy pomocy fadeOutWithDuration(). Problem polega na tym, że SKAction z fadeInWithDuration() nie działa, gdy scena jest zatrzymana.

Jak mogę to osiągnąć?

Odpowiedz

7

Najlepszym sposobem, którego Apple używa również w "DemoBots", jest stworzenie węzła światowego, który zatrzymasz zamiast sceny.

Tworzenie właściwość worldNode

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

dodać go do sceny w didMoveToView

addChild(worldNode) 

i dodaj niż wszystko, czego potrzeba do worldNode wstrzymane. To obejmuje działania, które są zazwyczaj prowadzone przez sceny (np. Złomowanie, wróg tarła itp)

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

niż w swoim przerwy func mówisz

worldNode.isPaused = true 
physicsWorld.speed = 0 

aw życiorysie

worldNode.isPaused = false 
physicsWorld.speed = 1 

Możesz również dodać dodatkowe sprawdzenie w funkcji Aktualizuj, jeśli masz tam rzeczy, które chcesz zignorować, gdy są wstrzymane.

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

ten sposób o wiele łatwiej dodać wstrzymane etykietę lub inny interfejs, gdy gra jest wstrzymana, ponieważ nie zostały faktycznie zatrzymał się na scenę.Możesz także uruchomić dowolną akcję, chyba że ta akcja zostanie dodana do węzła worldNode lub do dziecka węzła worldNode.

Nadzieja to pomaga

+0

Uratowałeś mnie, człowieku! Doceniam to rozwiązanie, ponieważ rozwiązało to kolejny problem pauzy! wygląda na to, ponieważ przestawałem z korzenia ... to powodowało opóźnienie fizyki, gdy się go nienawidziło. Teraz dzięki rozwiązaniu SKNode wszystko działa idealnie! – msqar

1

Więc chcesz przerwać grę PO wykonanie akcji zostało zakończone.

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

Szybkie obejście byłoby wstrzymać grę po na ekranie pojawi się SKLabelNode:

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

Innym rozwiązaniem byłoby wymieszać UIKit i SpriteKit i informuje ViewController z powrotem, że musi pokazać etykietę .

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

Zamiast zatrzymując się na scenie, można warstwę niektóre węzły scenę jak ten

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

Wtedy, gdy chcemy, aby wstrzymać grę, należy wstrzymać tylko SKNode 1.

Pozwala to Węzeł SKNode 2, aby kontynuować działanie, możesz robić takie rzeczy, jak animacje, i mieć przycisk, który rozpakowuje scenę dla ciebie, bez potrzeby dodawania jakiegoś obiektu Sprite Kit do miksu.

0

Dodam etykietę z

self.addChild(nameOfLabel) 

a następnie wstrzymać grę z

self.scene?.paused = true 

Wszystko to powinno iść w razie pauseButton dotknięciu część swoich kod.

Powiązane problemy