SKAction仅在睡眠后或在运行调试器时运行

Cam*_*ter 5 sleep ios sprite-kit skaction swift

我试图使用SpriteKit创建一个暂停菜单,以便在玩家继续游戏时在屏幕上进行动画处理(移动)。

我创建了一个SKAction并在开始运行时就这样运行它:

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

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)
}
Run Code Online (Sandbox Code Playgroud)

我在这里要做的是将pauseScroll的UI放置在另一个spritekit.scene文件中,作为实际的GameScene,所有这些操作均在代码中完成。然后,我通过调用.move(toParent:self)将其添加到GameScene中。

事情是,我可以很好地引用pauseScroll,可以对其进行修改,例如更改其位置,为其指定物理身体和碰撞蒙版,在pauseScroll中包含的节点上注册水龙头等。看似一切都在其上运行了SKActions。

我同时为其他SKSpriteNode运行SKAction,它们运行良好,当然它们的初始化方式有所不同,因为它们都是在.init中的代码中设置的,例如:

var background: SKSpriteNode!

override init(size: CGSize) {
  ...
  background = SKSpriteNode(imageNamed: "GameBackground")
  background.size = size
  addChild(background)
}
Run Code Online (Sandbox Code Playgroud)

然后,以与我在触摸中开始的其他任何操作相同的方式为它们设置动画:

let colorAction = SKAction.colorize(withColorBlendFactor: 0.4, 
duration: duration)
background?.run(colorAction)
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我在sleepScroll上运行SKAction的函数中的其他任何地方运行sleep(1);然后滚动动画并根据需要向上移动到屏幕之外。因此,这似乎是一个比赛条件,但对于它正在等待什么,我没有最模糊的线索。

无论是否睡眠(1),在打印pauseScroll和moveAction的值时,我都会得到相同的结果。

这是运行中的错误:

在此处输入图片说明

如果我在触摸开始的任何地方添加了sleep(1),那么会发生同样的事情,除了整个应用程序等待1秒钟,然后滚动才按原计划移出屏幕顶部。

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

iMa*_*ies 5

将孩子移动到新父母时,请.move(toParent: self)尝试将isPaused每个孩子的false 设置为false。我怀疑当您从场景中加载所有子级时它们都已暂停,并且也许SpriteKit会在场景首次出现时自动将isPaused设置为false。

tempScene.children.forEach() { child in
            child.isPaused = false
            child.move(toParent: newParentNode)
}
Run Code Online (Sandbox Code Playgroud)