SKSpriteNode .run 不工作或不完全工作
Posted
技术标签:
【中文标题】SKSpriteNode .run 不工作或不完全工作【英文标题】:SKSpriteNode .run doesn't work or doesn't work completely 【发布时间】:2017-12-16 19:48:32 【问题描述】:我正在尝试查找以下 skspritenode 奇怪行为的来源:有时它只是不执行 .run(...) 或执行不完整。我在其中找不到任何规律性,所以我想知道,这是否是一个已知问题?
func didBegin(_ contact: SKPhysicsContact)
let firstBody = contact.bodyA
let secondBody = contact.bodyB
if firstBody.categoryBitMask == CollisionBitMask.birdCategory && secondBody.categoryBitMask == CollisionBitMask.BonusCategory
secondBody.node?.removeFromParent()
print("contact began")
firstBody.node?.run(SKAction.run
print("run works")
)
else if firstBody.categoryBitMask == CollisionBitMask.BonusCategory && secondBody.categoryBitMask == CollisionBitMask.birdCategory
firstBody.node?.removeFromParent()
print("contact began")
secondBody.node?.run(SKAction.run
print("run works")
)
【问题讨论】:
我从来没有遇到过在 SKSpriteNode 上运行时遇到的问题,我无法找到代码中的错误。请发布一个您认为不起作用的示例。 这里是代码示例,即使“run works”没有触发,短语“contact started”也会触发。 只有当节点在场景中时,SKAction才会运行,你检查过吗?例如。如果两个节点都配置为触发 didBegin(contact),那么它们将各自从场景中移除另一个节点,从而导致动作被冻结。 但只有一个节点被删除,另一个应该运行该操作。 动作不会立即执行,而是由场景执行,这可能要到下一个动画帧才会发生。两个节点将相互联系,并且(如果它们被配置为 - 您没有显示该代码,所以我不确定)both 在此之前触发 didBegin 方法,因此它们可能会删除每个在动作开始之前来自场景的其他人。 【参考方案1】:目前还不清楚,为什么会导致问题,但是在我尝试在代码中的某处设置它的速度后,skspritenode 没有执行 .run:
enumerateChildNodes(withName: "bird", using: (
(node, error) in
let bg = node as! SKSpriteNode
bg.physicsBody?.affectedByGravity = false
bg.speed = 0 // <- after removing this, everything works fine
))
【讨论】:
啊哈,就是这样,干得好。 speed parameter 不是节点的速度,而是节点运行其动作的速度,因此将 t 设置为零,将停止所有动作。以上是关于SKSpriteNode .run 不工作或不完全工作的主要内容,如果未能解决你的问题,请参考以下文章
知道 skspritenode 已经完全移过另一个 skspritenode
SKSpriteNode UserInteractionEnabled 不工作