isPaused 在 SKNode() 中无法正常工作
isPaused not working properly in SKNode()
我正在用 Swift 4 和 SpriteKit 制作纸牌游戏。我制作了一个 SKScene 的自定义子 class,在这个 class 中是一个 SKNode,我将其用作层 (gameLayer),我将所有节点附加到该层上,这些节点将被停止。
我还做了一个按钮,它调用了一个函数(pauseGame)来切换gameLayer的isPaused,效果很好。
问题是:我希望当游戏移动到场景时,它开始已经停止,用户应该通过按下按钮开始游戏。但是当我在 didMove 函数中调用 pauseGame 函数时,它不起作用,gameLayer 仍然处于活动状态。
我做了一些观察,将“print (gameLayer.isPaused)”和帧计数放在更新函数中。它显示实际上场景以 gameLayer.isPaused 开始,在 didMove 中设置为 true,但在第 2 帧之后它被设置为 false。我真的不知道它会在哪里发生,因为我不会在代码的其他任何地方使用 gameLayer.isPaused。
当然,一个解决方案是在第 2 帧之后调用 pauseGame,但我认为这不是一个干净的方法。
class BMScene: SKScene {
let gameLayer = SKNode()
func pauseGame(){
if gameLayer.isPaused {
gameLayer.isPaused = false
} else {
gameLayer.isPaused = true
}
}
override func didMove(to view: SKView) {
self.pauseGame()
}
isPaused
是 SpriteKit 世界中的一团糟。我确实与 Apple 的开发人员争论过它的损坏性质,他们声称这就是它的工作方式,我们必须处理它。我所知道的最新暴行是 isPaused
对于新场景默认为 true,然后发送一条消息以取消暂停。最重要的是,当您取消暂停父节点时,它也会取消暂停所有子节点。
因此,在此处的代码中,重写场景的 isPaused
以便能够捕获暂停事件以阻止它转到其子项
class BMScene: SKScene {
let gameLayer = SKNode()
private var _paused : Boolean = false
override var isPaused : Boolean
{
get
{
return _paused
}
set
{
_paused = newValue
}
}
func pauseGame(_ state: Boolean? = null){
gameLayer.isPaused = state ?? !gameLayer.isPaused
}
override func didMove(to view: SKView) {
self.pauseGame(true)
}
}
这将阻止您的节点更改其子节点的暂停状态。这一刻之后,您应该可以完全控制您的 gameLayer 暂停状态,它应该按照您认为的方式流动。
我还修改了你的功能,允许你强制暂停状态,以及当你想切换状态时切换。
例如
Pause:
pauseGame(true)
'gameLayer.isPaused is now true
Unpause:
pauseGame(true)
'gameLayer.isPaused is now false
Toggle:
pauseGame()
'gameLayer goes from false to true, or true to false
??
表示 COALESCE,所以如果 state
为空,它将沿着链移动到下一个值,即 !gameLayer.isPaused
我正在用 Swift 4 和 SpriteKit 制作纸牌游戏。我制作了一个 SKScene 的自定义子 class,在这个 class 中是一个 SKNode,我将其用作层 (gameLayer),我将所有节点附加到该层上,这些节点将被停止。
我还做了一个按钮,它调用了一个函数(pauseGame)来切换gameLayer的isPaused,效果很好。
问题是:我希望当游戏移动到场景时,它开始已经停止,用户应该通过按下按钮开始游戏。但是当我在 didMove 函数中调用 pauseGame 函数时,它不起作用,gameLayer 仍然处于活动状态。
我做了一些观察,将“print (gameLayer.isPaused)”和帧计数放在更新函数中。它显示实际上场景以 gameLayer.isPaused 开始,在 didMove 中设置为 true,但在第 2 帧之后它被设置为 false。我真的不知道它会在哪里发生,因为我不会在代码的其他任何地方使用 gameLayer.isPaused。
当然,一个解决方案是在第 2 帧之后调用 pauseGame,但我认为这不是一个干净的方法。
class BMScene: SKScene {
let gameLayer = SKNode()
func pauseGame(){
if gameLayer.isPaused {
gameLayer.isPaused = false
} else {
gameLayer.isPaused = true
}
}
override func didMove(to view: SKView) {
self.pauseGame()
}
isPaused
是 SpriteKit 世界中的一团糟。我确实与 Apple 的开发人员争论过它的损坏性质,他们声称这就是它的工作方式,我们必须处理它。我所知道的最新暴行是 isPaused
对于新场景默认为 true,然后发送一条消息以取消暂停。最重要的是,当您取消暂停父节点时,它也会取消暂停所有子节点。
因此,在此处的代码中,重写场景的 isPaused
以便能够捕获暂停事件以阻止它转到其子项
class BMScene: SKScene {
let gameLayer = SKNode()
private var _paused : Boolean = false
override var isPaused : Boolean
{
get
{
return _paused
}
set
{
_paused = newValue
}
}
func pauseGame(_ state: Boolean? = null){
gameLayer.isPaused = state ?? !gameLayer.isPaused
}
override func didMove(to view: SKView) {
self.pauseGame(true)
}
}
这将阻止您的节点更改其子节点的暂停状态。这一刻之后,您应该可以完全控制您的 gameLayer 暂停状态,它应该按照您认为的方式流动。
我还修改了你的功能,允许你强制暂停状态,以及当你想切换状态时切换。
例如
Pause:
pauseGame(true)
'gameLayer.isPaused is now true
Unpause:
pauseGame(true)
'gameLayer.isPaused is now false
Toggle:
pauseGame()
'gameLayer goes from false to true, or true to false
??
表示 COALESCE,所以如果 state
为空,它将沿着链移动到下一个值,即 !gameLayer.isPaused