SKAction仅在睡眠或运行调试器

时间:2017-12-31 08:03:06

标签: ios swift sprite-kit sleep skaction

使用SpriteKit我尝试制作一个暂停菜单,当玩家恢复游戏时,该菜单会在屏幕上显示动画(移动)。

我创建了一个SKAction并在触摸中运行它就像这样:

let duration = TimeInterval(0.5)
let moveAction = SKAction.move(to: CGPoint(x: 0, y: 495) , duration: 
duration)
pauseScroll?.run(moveAction) 

pauseScroll初始化为:

weak var pauseScroll: SKSpriteNode?

override init(size: CGSize) {
  ...
  let pauseScene = SKScene(fileNamed: "PauseMenu")!
  pauseScroll = pauseScene.childNode(withName: "PauseScroll") as? 
  SKSpriteNode
  pauseScroll?.position = CGPoint(x: 0, y: 495)
  pauseScroll?.zPosition = 1000
  pauseScroll?.move(toParent: self)
}

我在这里做的是在另一个spritekit.scene文件中将pauseScroll的UI布局为实际的GameScene,其中所有运行都是在代码中完成的。然后我把它带过来并通过调用.move(toParent:self)将它添加到GameScene。

问题是我可以引用pauseScroll就好了,我可以修改它,例如改变它的位置,给它一个物理体和碰撞掩码,在pauseScroll中包含的节点上注册点击等等。看似所有东西,但在它上面运行SKActions。

我同时为其他SKSpriteNodes运行SKActions并且它们工作正常,当然它们的初始化方式不同,因为它们都是在.init中的代码中设置的,例如:

var background: SKSpriteNode!

override init(size: CGSize) {
  ...
  background = SKSpriteNode(imageNamed: "GameBackground")
  background.size = size
  addChild(background)
}

然后,我开始制作动画,就像我开始接触其他任何事情一样:

let colorAction = SKAction.colorize(withColorBlendFactor: 0.4, 
duration: duration)
background?.run(colorAction)

有趣的是,如果我在pauseScroll上运行SKAction的函数中的其他任何地方运行sleep(1);然后滚动动画并按原样从屏幕上移开。因此,它似乎是一种竞争条件,但我对它正在等待的东西没有最微弱的线索。

当打印pauseScroll和moveAction的值时,我得到相同的结果(1)或不睡觉。

以下是行动中的错误:

enter image description here

如果我将睡眠(1)添加到触摸开始的任何地方,那么同样的事情发生,除了整个应用等待1秒之后滚动从屏幕顶部向上移动,因为它的意思。

如果有必要,我很乐意提供更多代码。

3 个答案:

答案 0 :(得分:3)

当您使用.move(toParent: self)将孩子移动到新父母时,请尝试将isPaused设置为每个孩子的假。我怀疑当你从一个场景中加载它们时所有的孩子都被暂停了,并且当场景第一次出现时,SpriteKit可能会自动将它设置为false。

tempScene.children.forEach() { child in
            child.isPaused = false
            child.move(toParent: newParentNode)
}

答案 1 :(得分:0)

尝试在父级的isPaused方法中设置init()

将其视为UIView-如果将父级设置为隐藏,则子视图(无论是否未隐藏)都不会显示。

答案 2 :(得分:0)

我遇到了这个问题,当将“ isPaused”设置为false时,我发现该问题不需要为所有子节点设置,而只需要为正在被子节点使用的父节点设置。移到了。

例如,如果我的sprite1带有三个子sprite节点,并且我想使sprite2成为这三个子sprite节点的新父节点,那么在使用move(toParent)之后,只需将sprite2的isPaused设置为false即可。

这就是我为我解决问题所需要做的一切。这似乎表明,通过设计,使用move(toParent)时,接收父级及其子级的操作会自动暂停。