SpriteKit 和 SceneKit – 如何完全暂停游戏?

Posted

技术标签:

【中文标题】SpriteKit 和 SceneKit – 如何完全暂停游戏?【英文标题】:SpriteKit and SceneKit – How to completely pause a game? 【发布时间】:2014-11-07 14:50:26 【问题描述】:

我成功地用这个代码暂停了一个场景游戏:

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) 

    var touch:UITouch = touches.anyObject() as UITouch 
    pauseText.text = "Continuer"
    pauseText.fontSize = 50
    pauseText.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2)

    /* bouton play/pause */

    var locationPause: CGPoint = touch.locationInNode(self)

    if self.nodeAtPoint(locationPause) == self.pause 
        println("pause")
        addChild(pauseText)
        pause.removeFromParent()
        paused = true
    
    if self.nodeAtPoint(locationPause) == self.pauseText 
        pauseText.removeFromParent()
        paused = false
        addChild(pause)
    

但是我有一个问题。 游戏创建对象的所有随机间隔并将它们显示在屏幕上。当我暂停游戏时,它会继续在后台创建对象,当我恢复游戏时,暂停期间创建的所有对象都会同时出现在屏幕上。

我该如何解决?

【问题讨论】:

设置 scene.view.paused = true 或 false 来暂停/恢复你的游戏。 谢谢!它有效,但标签 pauseText 没有出现。我该怎么办? 【参考方案1】:

当 SKView 暂停时,您不能将 SKLabelNode(或其他任何东西)添加到您的场景中。您将需要返回到运行循环,以便在暂停游戏之前添加您的文本。这是一种方法:

// Add pause text or button to scene
addChild(pauseText)
let pauseAction = SKAction.run 
    self.view?.isPaused = true

self.run(pauseAction)

【讨论】:

完美运行!!非常感谢 !!我考虑了这个规则(在暂停前添加标签),这就是为什么我在暂停游戏代码之前编写文本代码的原因。但我不认为它需要制作另一个功能。你能解释一下吗? 向场景添加子节点不会立即执行。它是在您从 touchesBegan 返回后添加的。 scene.view.paused 语句会立即执行(或具有更高的优先级),因此它会在您的 SKLabelNode 添加到场景之前执行。

以上是关于SpriteKit 和 SceneKit – 如何完全暂停游戏?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 SceneKit 中的 SpriteKit 覆盖拉伸?

将scenekit和spritekit组合在一个屏幕中

SceneKit:在 SCNView 上渲染 SpriteKit 粒子系统时应用程序崩溃,当所有代码似乎都是系统代码的一部分时如何调试

从SceneKit中检测SpriteKit按钮按叠加

SpriteKit/Scenekit TouchesBegan 或 GestureRecognizer

将纯 Metal-API 与 SceneKit 或 SpriteKit 一起使用