使用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)或不睡觉。
以下是行动中的错误:
如果我将睡眠(1)添加到触摸开始的任何地方,那么同样的事情发生,除了整个应用等待1秒之后滚动从屏幕顶部向上移动,因为它的意思。
如果有必要,我很乐意提供更多代码。
答案 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)时,接收父级及其子级的操作会自动暂停。