我正在使用Swift 4和SpriteKit进行纸牌游戏。我创建了一个SKScene的自定义子类,在这个类中是一个SKNode,我将其用作一个层(gameLayer),我将所有节点附加到其上,这些节点将被停止。
我也做了一个按钮,它调用了一个函数(pauseGame)来切换gameLayer的isPaused,它运行得很好。
问题是:我希望当游戏移动到场景时,它开始已经停止,用户将按下按钮开始游戏。但是当我在didMove函数中调用pauseGame函数时,它不起作用,gameLayer仍然有效。
我做了一些观察,在更新功能中加入'print(gameLayer.isPaused)'和帧数。它表明,实际上场景开始时,gameMay中的gameLayer.isPaused设置为true,但是在第二帧之后它被设置为false。我真的不知道它会发生在哪里,因为我不会在游戏中吸引gameLayer.isPaused。
当然解决方法是在第二帧之后调用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()
}
答案 0 :(得分:1)
isPaused
是SpriteKit世界的混乱局面。我真的和苹果公司的开发人员讨论过它的破碎本质,并且他们声称这是打算如何工作的,我们必须处理它。我所知道的最新的暴行是isPaused
默认为新场景为真,然后发出一条消息以取消它。最重要的是,当您取消暂停父节点时,它也会取消暂停所有子节点。
因此,在此处的代码中,覆盖场景的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暂停状态,它应该按照你认为的流动方式流动。
我还修改了你的功能,允许你强制暂停状态,以及在想要交换状态时切换。
E.g。
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