快速测试节点是不是附加到物理体

Posted

技术标签:

【中文标题】快速测试节点是不是附加到物理体【英文标题】:testing if a node is attached to a physicsBody swift快速测试节点是否附加到物理体 【发布时间】:2017-10-26 14:56:27 【问题描述】:

我在检测到 SKSpriteNode 之间的接触时调用的函数中将节点附加到接触体 (SKPhysicsBody)。有时,我会收到一个错误,因为它无法将节点附加到联系人正文,因此我测试是否有节点以避免此类错误。但是一个警告告诉我它永远不会返回错误。自从我测试它以来,我再也没有出现过这样的错误,但我不确定它是否运作良好或者它是否仍然会发生。你有什么想法吗?

//The actual code
func didBegin(_ contact: SKPhysicsContact) 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory) //test if it is the contact with I want to catch
        let shootNode = contact.bodyB.node, shootNode != nil  // I test if there's a node attached to the enemyShootNode but it's supposed never to return false
            let enemyNode = contact.bodyA.node, enemyNode != nil  // I test if there's a node attached to the shootNode but it's supposed never to return false
                let enemySKNode = enemyNode as? SKSpriteNode
                let shootSKNode = shootNode as? SKSpriteNode
                // code
            
        
    


   // The code with error
func didBegin(_ contact: SKPhysicsContact) 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory)
        let shootNode = contact.bodyB.node!
        let enemyNode = contact.bodyA.node! // The error occurs here : "fatal error: unexpectedly found nil while unwrapping an Optional value"
        let enemySKNode = enemyNode as? SKSpriteNode
        let shootSKNode = shootNode as? SKSpriteNode
     

【问题讨论】:

我建议在 SO 上更好地搜索并花时间了解其他人的困境,这样你会学到很多东西。 ***.com/questions/36655903/…,***.com/questions/31057866/…,***.com/questions/30030784/…,***.com/questions/34188183/… Receiving an error when nodes make contact的可能重复 我建议您也阅读这个问题的解决方案。通常,这与可选的? 变量被分配了nil 的值有关。我会检查您的变量的初始化或在代码中添加一些断点以查看nil 值可能来自何处。 ***.com/questions/32170456/… @KSigWyatt,我可以告诉你他的nil 来自哪里。他在更新周期的物理阶段删除了node。物理阶段保留了它需要使用的物理体,但不保留node。因为SKPhysicsbody.nodeweak reference,所以node 变成nil @Knight0fDragon 啊,那是有道理的。 【参考方案1】:

感谢您的建议,错误确实来自 SKPhysics 属性(didBegin 函数被多次调用)但我没有设法修复。 虽然我纠正了我检查精灵是否在这里的方式,并且没有更多的警告或错误,所以我认为它运作良好:

func didBegin(_ contact: SKPhysicsContact) 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory) || (contact.bodyA.categoryBitMask == shootCategory) && (contact.bodyB.categoryBitMask == enemyCategory)
        if var shootNode = contact.bodyB.node
            if var enemyNode = contact.bodyA.node
                // If the enemyNode and the shootNode don't respectively correspond to 
                if contact.bodyA.categoryBitMask == shootCategory 
                    shootNode = contact.bodyA.node!
                    enemyNode = contact.bodyB.node!
                
                let enemySKNode = enemyNode as? SKSpriteNode
                let shootSKNode = shootNode as? SKSpriteNode
            
        
    

【讨论】:

以上是关于快速测试节点是不是附加到物理体的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 将片段附加到DOM而不是每个节点。

将片段附加到DOM而不是每个节点。

var 不附加到全局

无法快速将对象附加到对象数组

如何检测 html 元素是不是可以附加子节点?

如何将子节点附加到特定位置