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 变量

使 SKSpriteNode 透明

SKSpriteNode UserInteractionEnabled 不工作

SKSpriteNode 纹理 alpha 是不是影响触摸区域?

iOS Spritekit - SKSpriteNode .centerRect 属性不起作用