当应用程序变为活动状态时,如何保持SpriteKit场景暂停?

Pin*_*ton 6 ios sprite-kit skscene

反正是否阻止SpriteKit在进入前景/变为活动状态时自动取消暂停场景?

我设置paused = true并希望它保持这样,即使应用程序在被发送到后台后再次变为活动状态.

我应该补充一点,我正在迅速做到这一点,尽管我不希望这方面的行为有所不同.

Kni*_*gon 5

不确定它在目标C中是否相同,但在swift中我必须"覆盖"SKView在幕后调用的回调函数,

func CBApplicationDidBecomeActive()
{

}
Run Code Online (Sandbox Code Playgroud)

此功能导致暂停重置.

(注意不应用override关键字)

在某些情况下,您只想保留暂停状态,请改为创建一个新变量并覆盖isPaused方法.

class GameScene:SKScene
{
  var realPaused = false
  {
     didSet
     {
         isPaused = realPaused
     }
  }
  override var isPaused : Bool
  {
    get
    {
       return realPaused
    }
    set
    {
      //we do not want to use newValue because it is being set without our knowledge
      paused = realPaused
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我对 Knight0fDragon 的解决方案进行了一些调整,使其适合我。这使得 isPaused 始终等于 realPaused。为了暂停游戏,只需更改“realPaused”变量,它也会自动更改 isPaused 变量。

var realPaused: Bool = false {
    didSet {
        self.isPaused = realPaused
    }
}
override var isPaused: Bool {
    didSet {
        if (self.isPaused != self.realPaused) {
            self.isPaused = self.realPaused
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当应用程序在后台运行时,这将阻止场景暂停。为了防止这种情况,我将条件更改为:“self.isPaused!= self.realPaused && self.isPaused == false”,这样当应用程序置于后台时,场景仍然会自动暂停,但只会重新启动如果 realPaused 也为 true,则 actiate:

var realPaused: Bool = false {
    didSet {
        self.isPaused = realPaused
    }
}
override var isPaused: Bool {
    didSet {
        if (self.isPaused == false && self.realPaused == true) {
            self.isPaused = true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*ter 1

您应该使用您的应用程序委托,特别是 applicationDidBecomeActive 方法。在该方法中发送 SpriteKit 视图侦听的通知。

因此,在 applicationDidBecomeActive 方法中,您的代码应如下所示:

// Post a notification when the app becomes active
[[NSNotificationCenter defaultCenter] postNotificationName:@"appIsActive" object:nil];    
Run Code Online (Sandbox Code Playgroud)

现在,在 SKScene 文件中的 didMoveToView 方法中输入以下内容:

// Add a listener that will respond to the notification sent from the above method
 [[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(theAppIsActive:) 
                                              name:@"appIsActive" object:nil];
Run Code Online (Sandbox Code Playgroud)

然后只需将此方法添加到您的 SKScene 文件中:

//The method called when the notification arrives
(void)theAppIsActive:(NSNotification *)note 
{
    self.view.paused = YES;
}
Run Code Online (Sandbox Code Playgroud)