SpriteKit:在场景暂停时运行动作

时间:2016-02-21 13:07:16

标签: ios swift sprite-kit

我有一个按钮可以在我的代码上暂停游戏。我想要的是,将游戏与该按钮暂停会发出一条消息,表示"已暂停"出现。但是,由于场景暂停,因此不会显示该消息。

我现在拥有的是SKLabelNode,其开头时alpha值为0.0,当用户暂停游戏时,它会使用fadeInWithDuration()更改为1.0。然后当用户再次按下按钮时,它会使用fadeOutWithDuration()变回0.0。问题是当场景暂停时,带有fadeInWithDuration()的SKAction不会运行。

我怎么能实现这个目标?

5 个答案:

答案 0 :(得分:11)

最好的方法,一个Apple也用于#34; DemoBots",就是创建一个暂停而不是场景的世界节点。

创建一个worldNode属性

class GameScene: SKScene {

    let worldNode = SKNode()
}

将其添加到didMoveToView

中的场景中
addChild(worldNode)

然后将您需要的所有内容添加到worldNode。这包括通常由场景运行的动作(例如,计时器,敌人产卵等)

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

比你在暂停功能中说的那样

worldNode.isPaused = true
physicsWorld.speed = 0

和简历

worldNode.isPaused = false
physicsWorld.speed = 1

如果您在暂停时有想要忽略的内容,也可以在更新功能中添加额外的检查。

override func update(_ currentTime: CFTimeInterval) {

    guard !worldNode.isPaused else { return }

    // your code
}

这样,当您的游戏暂停时,添加暂停的标签或其他用户界面会更容易,因为您实际上并未暂停场景。除非将该操作添加到worldNode或worldNode的子级,否则您还可以运行所需的任何操作。

希望这有帮助

答案 1 :(得分:3)

不是暂停场景,而是可以像这样将

场景中的某些节点分层
 SKScene
 |--SKNode 1
 |  |-- ... <--place all scene contents here
 |--SKNode 2
 |  |--  ... <--place all overlay contents here

然后,当您想暂停游戏时,只暂停SKNode 1。

这允许节点SKNode 2继续运行,因此您可以执行诸如动画之类的操作,并且有一个按钮可以为您取消暂停场景,而无需在混合中添加一些非Sprite Kit对象。 / p>

答案 2 :(得分: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()
    }
}

答案 3 :(得分:1)

所以你想暂停游戏 AFTER 动作执行完毕。

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))
        }
    }
}

答案 4 :(得分:0)

我会用

添加标签
self.addChild(nameOfLabel)

然后暂停游戏

self.scene?.paused = true

这应该都是在你的代码中触摸了一个if pauseButton。