暂停SpriteKit游戏并显示菜单

3

我想在我的SpriteKit游戏中添加暂停菜单,但我总是遇到这段代码

self.scene.view.paused == YES

然而,它会暂停游戏内的所有事物,包括touchesBegan方法。因此,在我暂停游戏之前显示菜单时,我无法与其交互,因为touchesBegan不起作用。我已经在谷歌上搜索了这个问题,有些人只是建议将菜单添加为SKNode,但即使这样也没有帮助,因为它会忽略暂停状态下的触摸输入。

3个回答

3

正如您所说,您不能暂停场景并继续使用它。所以你有两个选择:

如果您想使用pause属性,则应将包含暂停按钮的暂停菜单作为子视图添加到包含场景的SKView中。即:

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    SKView * skView = (SKView *)self.view;
    UIView *pauseMenu = [[UIView alloc] initWithFrame:rect]; // This should be the pause menu with the pause button

    [skview addSubview:pauseMenu];
}

暂停按钮将触发一个方法,该方法应取消暂停SKView

另一种方法是在场景内手动管理暂停状态,使用自己的暂停标志而不更新游戏。如果您使用了许多动作,则此方法可能不是最佳解决方案。好处是您可以创建暂停效果,而不会冻结游戏,看起来更酷:)


谢谢您的快速回复。我是编程新手,不太明白如何从游戏中访问暂停子视图?我的意思是如何从“gamescene”类触发视图控制器? 顺便说一下,我不能使用您提供的第二种解决方案。因为我的应用程序使用了很多操作,如果全部手动管理将会非常困难。 - user3545063
你实际上不需要从场景中访问ViewController。你只需要添加一个带有暂停按钮的视图,并添加一个暂停skView的操作。所有的事情都发生在viewcontroller上,场景只接收暂停或取消暂停事件。或者,如果你想在场景本身中添加暂停按钮,你可以将ViewController设置为游戏场景的代理。 - gzafra

2
当您点击暂停按钮时,设置self.pause=YES; 将“暂停菜单触摸检查”移到触摸事件的开始位置。在这些检查之后,添加:
if(self.pause == YES)
     return;

这将防止其他触摸事件的触发。

在您的更新方法的最开始添加此行,以便在暂停时停止时间的更新。

这就是如何基本上冻结时间和物理效果,同时仍然能够触摸暂停菜单项。


谢谢回复。你能再解释一下吗?为什么if检查会阻止其他触摸事件?当我设置self.pause=YES;时,touchesbegan方法是如何工作的? - user3545063
self.pause=YES; 不会阻止触摸事件。我进行这些检查是为了在与我的菜单交互时不触发其他与游戏相关的触摸事件。菜单触摸将位于检查之上,因此即使游戏已暂停,您也可以触摸它们。我将检查添加到更新中,以防止时间更新。如果您有一个SKAction并且在时间运行时暂停,当您恢复时,对象将出现,就好像游戏从未暂停并一直运行。 - meisenman
想象一下,你有一个触摸事件,在你触摸的地方创建一个小精灵。如果游戏暂停了,你不希望这个事件触发并创建一个新的精灵。然而,你仍然希望能够检查你的菜单“按钮”是否被触摸。 - meisenman

1
在我的应用程序中,我也发现了这样的情况:self.scene.view.paused == YES会暂停所有东西,包括触摸事件和动画。然而,我还发现self.scene.paused == YES将暂停场景中的所有节点及其动作/动画,但不会影响触摸事件,例如暂停菜单中的任何节点/按钮。我认为暂停视图将影响触摸事件,但是暂停场景不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接