使用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)与否。
这是行动中的错误:
如果我将sleep(1)添加到触摸开始的任何地方,那么同样的事情发生,除了整个应用等待1秒之后滚动从屏幕顶部向上移动,就像它的意思。
如果有必要,我很乐意提供更多代码。
当您使用.move(toParent: self)
将孩子移动到新父母时,请尝试在每个孩子上将isPaused
设置为false。我怀疑当你从一个场景中加载它们时所有的孩子都被暂停了,并且当场景第一次出现时,SpriteKit可能会自动将其设置为false。
tempScene.children.forEach() { child in
child.isPaused = false
child.move(toParent: newParentNode)
}
尝试在父母的isPaused
方法中设置init()
。
将其视为UIView
- 如果父级设置为隐藏,则子视图(无论它们是否未隐藏)将不会显示。
我遇到了这个问题,并且在将“isPaused”设置为false时解决了问题,我发现不需要为所有子节点设置它,而只需要为子节点移动到的父节点设置。
例如,如果我有一个带有三个子精灵节点的sprite1,并且我想让sprite2成为这三个子精灵节点的新父节点,那么在使用move(toParent)之后,只需为sprite2设置isPaused为false。
这就是我为解决这个问题所必须做的一切。这似乎表明,通过设计,当使用move(toParent)时,接收父节点及其子节点的动作会自动暂停。