如何有效地暂停 spritekit 中的游戏?

Posted

技术标签:

【中文标题】如何有效地暂停 spritekit 中的游戏?【英文标题】:How to effectively pause a game in spritekit? 【发布时间】:2014-05-07 03:47:51 【问题描述】:

这似乎是一个基本概念,但实际上没有好的答案。

我目前有一个非常基本的设置,在我的游戏场景中,我有一个enum gameState,目前是inGamegamePaused

我已经设置好按钮,按下它可以切换gameState

然后,为了让它工作,我有两种单独的更新方法:一种用于gamePaused,一种用于inGame

这适用于我 95% 的游戏,因为我的游戏中的更新可以很容易地启动和停止,没有任何问题。但有些问题我无法解决。

首先是行动。我将SKActions 用于我的一些项目(一些移动、缩放、褪色......),这种方法不会暂停它们。这在某些方面可能是灾难性的。其次,这不处理粒子、物理和其他一些与我的更新方法没有直接关联的东西。

我唯一的线索是self.view.paused = YES,但这也行不通。

首先,这确实解决了我的动作、粒子和物理问题……有点。但是This question 表明SKActions 实际上并没有因此而暂停,而是实际上完全停止了。这是真的?如果是这样,那么它也不会顺利进行,因为我的行为不正常。

此外,暂停视图似乎就像它所说的那样:停止一切。一切。新手问题在这里,但我应该如何让任何代码在那时运行?这一切都被切断了。这是我需要subViews 的地方吗?我从未使用过subView,但在这种情况下,这听起来像是我想要的。

简而言之,我有很多未解决的问题,我不知道如何继续。我希望在Sprite Kit 中有一些暂停的“标准程序”,但是暂停视图暂停操作我真的不知道从哪里开始。

我应该放弃使用操作吗?我的暂停subView 的想法听起来好吗?

我不想喋喋不休,我只想知道你是如何在你的普通Sprite Kit 项目中暂停的。应要求提供其他信息。

【问题讨论】:

1.尝试将动作速度设置为 0.0。 2.尝试将场景暂停设置为YES。 3.尝试将self.view.paused设置为YES 4.尝试这三者的组合。 【参考方案1】:

暂停节点将暂停(而不是停止)节点的操作,我想暂停也将以相同的方式应用于暂停节点的所有子节点。所有其他未暂停的节点将继续运行它们的操作以完成。

您应该有一个“游戏层”节点,其中包含要暂停的所有游戏节点,然后暂停该“游戏层”节点。然后有一个“暂停游戏菜单”节点,您可以在其中添加所需的所有暂停菜单内容,即使游戏层暂停,这些内容也将继续正常运行。

请务必确保不要使用 performSelectorNSTimer 或 GCD 或除了操作或场景的 update: 方法之外的任何其他调度方法,因为这些不会遵守节点的暂停状态。

暂停视图有效地冻结了其中的所有内容,根据某些暂停场景不会暂停更新:调用 - 但我自己还没有验证这一点。如果是这种情况,您可以随时在更新方法内部检查您发送消息的给定节点是否已暂停,如果是,请决定不向该节点发送某些消息。

【讨论】:

这似乎效果最好,但我不敢相信我错过了它......暂停节点不会停止动作,通过暂停我的游戏层,我的暂停按钮的基础就完成了。我没有意识到可以暂停单个节点,这样做也会影响孩子们......谢谢。顺便说一句,这个帖子中的所有其他建议也很有用:) 这是最好的!我的头有点痛,因为在阅读您的答案之前它经常被撞到墙上:) 非常感谢【参考方案2】:

我只是在场景的所有子节点上调用了一个地图函数,并将 paused 属性设置为 true

self.children.map($0 as SKNode).paused = false

通过将其设置为 true,您可以轻松撤消冻结。

编辑: 最好使用 for 循环来遍历子级。

for node in self.children as [SKNode] 
    node.paused = false

【讨论】:

【参考方案3】:

我可以告诉你我在我的游戏中做了什么:

    -applicationWillResignActive:(或等效项,使用NSNotifications)上暂停SKView

    取消暂停-applicationDidBecomeActive: 上的SKView(或等效项,使用NSNotifications),

仅针对实际游戏场景,我在退出活动时设置了一个布尔标志_isPaused,如果是真的,我将跳过-update: 方法(帧更新)。 (当用户恢复应用时,我还会显示“暂停”菜单)。

...但是我的游戏是一个简单的益智游戏,没有应该在暂停/恢复之后继续的长动作。我现在无法确认所有操作都已中止,但我认为不是

【讨论】:

感谢您的快速回复,我现在需要睡觉,但我一定会调查一下。我还将测试操作中止问题,因为我的代码在视图暂停时死了,所以我无法找到如何做。你的方法几乎看起来很简单,但它肯定会给我一个基础。与此同时,我欢迎其他人提供新信息 :) 干杯 太好了,如果你修复它,请告诉我,以及如何解决。想法越多越好。【参考方案4】:

我还使用了self.children.map($0 as SKNode).paused = false,如果您创建一个 SKSpriteNode 类型的 var 图层并将其添加到场景顶部,它确实可以工作。但我也有一个 NSTimer 用来在场景中生成精灵。当前场景中的所有内容都已暂停,但精灵继续出现并在屏幕上移动。它不会暂停产卵。

我尝试在调用上述代码时暂停 NSTimer,方法是将重复设置为 false,然后在删除图层时将其设置为 true,但它不起作用。我也尝试过self.scene?.view?.paused = true,但这会冻结所有内容,我创建的图层甚至不会出现在屏幕上。

【讨论】:

【参考方案5】:

您需要为视图设置委托!

func PauseGame()
   self.scene.view.paused = true


fun playGame()
   self.scene.pause = false

【讨论】:

【参考方案6】:

如果您不使用NSTimer 调用函数,则此函数可以完美运行。如果您使用 NSTimer,您的视图将完全暂停,但是当您通过玩游戏功能再次玩游戏时,您会看到所有使用 NSTimer 功能的功能都在后端运行,并且您的屏幕充满了 sprite-kits。因此,当您在函数中使用NSTimer 时,您必须先暂停 NSTimer 函数,然后此函数才能完美运行。

//For Pause
func pauseGame() 
    scene?.view?.paused = true


//For play.
func playGame()  
  scene?.view?.paused = false

【讨论】:

以上是关于如何有效地暂停 spritekit 中的游戏?的主要内容,如果未能解决你的问题,请参考以下文章

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

在 spritekit 中暂停游戏时显示菜单

Spritekit - 在 didBecomeActive 时保持游戏暂停

暂停和重置游戏 Spritekit / Swift 之间的区别?

使用 SpriteKit 时如何暂停声音

暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?