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

问题描述 投票:4回答:3

使用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

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

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

ios swift sprite-kit sleep skaction
3个回答
3
投票

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

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

0
投票

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

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


0
投票

我遇到了这个问题,并且在将“isPaused”设置为false时解决了问题,我发现不需要为所有子节点设置它,而只需要为子节点移动到的父节点设置。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.