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

时间:2014-05-07 03:47:51

标签: ios objective-c sprite-kit

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

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

我按下了我的按钮,我按下按钮只需切换gameState

然后,为了使其有效,我有两个单独的更新方法:一个用于gamePaused,一个用于inGame

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

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

我唯一的线索是self.view.paused = YES,但这也无济于事。

首先,这可以解决我的行为,粒子和物理问题......有点儿。但是This question表明SKActions实际上并未因此而被暂停,但实际上已经完全停止了。这是真的?如果是的话,那么它也不会顺利运作,因为我的行为被抛弃了。

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

简单地说,对我来说有很多未解决的问题,我不知道如何继续。我希望在Sprite Kit暂停一些'标准程序',但暂停停止操作的视图我真的不知道从哪里开始。

我应该放弃使用行动吗?我的想法是暂停subView吗?

我不想唠叨,我想知道的是你如何在平均Sprite Kit项目中暂停。根据要求提供其他信息。

6 个答案:

答案 0 :(得分:13)

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

你应该有一个"游戏层"其中包含您要暂停的所有游戏节点的节点,然后暂停该游戏层"游戏层"节点。然后有一个"暂停游戏菜单"节点,您可以添加所需的所有暂停菜单,即使游戏图层暂停,它也会继续正常运行。

除了操作或场景更新方法之外,请确保您不使用performSelectorNSTimer或GCD或任何其他调度方法,因为这些方法不会遵循节点&#39 ; s暂停状态。

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

答案 1 :(得分:2)

我刚刚在场景的所有子项上调用了map函数,并将paused属性设置为true

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

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

修改 最好使用for循环迭代孩子们。

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

答案 2 :(得分:1)

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

  1. 暂停SKView -applicationWillResignActive:(或等效,使用NSNotification s),

  2. 取消暂停SKView -applicationDidBecomeActive:(或等效,使用NSNotification s),

  3. 仅对于实际游戏场景,我在重新启动活动时设置布尔标志_isPaused,如果为真,我只是跳过-update:方法(帧更新)。 (当用户恢复应用程序时,我也会显示“暂停”菜单。)

    ...但我的游戏是一款简单的益智游戏,并且没有长时间的动作可以继续超过暂停/恢复。我现在无法确认所有行动都已中止,但我认为的情况。

答案 3 :(得分:0)

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

当我通过将重复设置为false来调用上面的代码时尝试暂停NSTimer,然后在删除图层时将其设置为true但它不起作用。我也试过self.scene?.view?.paused = true,但冻结了一切,我创建的图层甚至没有出现在屏幕上。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

您需要设置View的委托!

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

fun playGame(){
   self.scene.pause = false
}