SKAction 中的代码运行操作未执行

Posted

技术标签:

【中文标题】SKAction 中的代码运行操作未执行【英文标题】:Code inside SKAction run action not executing 【发布时间】:2016-12-21 01:42:50 【问题描述】:

SKAction.run 操作中的代码块由于某种原因永远不会执行。

澄清一下,startAction 内部的两行由于某种原因从未运行,即使其他行确实运行。

在这些行上放置断点证明这些行永远不会执行。

有什么线索吗?

    // Set first frame
    let firstFrame = frames[0]
    let animationNode = SKSpriteNode(texture: firstFrame)
    animationNode.position = CGPoint(x: x, y: y)

    // Set start action
    let startAction = SKAction.run(
        gAudio.playSound(file: .TestSound) // Never runs
        self.animationLayer.addChild(animationNode) // Never runs
    )

    // Set rest of animation
    let timePerFrame = 0.5
    let animationAction = SKAction.animate(with: frames, timePerFrame: timePerFrame, resize: false, restore: true)
    let removeAction = SKAction.removeFromParent()
    let animationSequence = SKAction.sequence([startAction, animationAction, removeAction])

    // Run animation
    animationNode.run(animationSequence)

【问题讨论】:

run 是立即的,但是该块将进入队列并且不能保证在调用 run 的确切时间触发,因此一旦您触发它,下一个序列将触发,从而删除在运行中的任何事情发生之前从父节点获得节点 @Knight0fDragon 非常感谢,为什么不作为答案发布?这似乎解释了问题,不是吗? 仅当动画也没有运行时 @Knight0fDragon 仅在动画未运行时?您能否发布答案,因为如果您确定这些细节,它可以解释问题吗? animationAction 【参考方案1】:

在将节点放置在场景中之前,不会为节点触发动作,您将面临先有鸡还是先有蛋的困境。您想在节点(鸡蛋)存在于世界中(鸡生出同一个鸡蛋)之后,将节点(鸡蛋)添加到场景(鸡)中。您需要将节点放置在场景中,然后节点才能运行这些操作。

将你的开始动作放在你的场景上,而不是你的节点上,它应该开始运行

【讨论】:

再次感谢!实际上,您的解释中似乎最有见地的部分是关于计时动作以及如何保证涉及run 动作的一系列动作。也想包括那一点? 不,因为它与您的问题无关,只会让人们感到困惑 @Knight0fDragon 你能帮我看看这篇文章吗。我已经有一段时间了***.com/questions/42602058/…

以上是关于SKAction 中的代码运行操作未执行的主要内容,如果未能解决你的问题,请参考以下文章

你如何让 Swift 等待 SKAction 被执行?

SpriteKit - 对在多个 SKNode 上运行的多个 SKAction 进行排序

spritekit 如何在两个不同的节点上转换两个 SKAction

在 runBlock 发生后延迟 SKAction.sequence 中的下一个动作(Swift)?

在更新动画时运行遵循路径的 SKAction

按顺序运行已完成的 SKAction