菜鸟教程小白 发表于 2022-12-12 23:18:04

ios - Sprite Kit 碰撞错误 - Swift


                                            <p><p>我是 IOS 开发新手,目前在 didBeginContact 方法中遇到一些 Sprite 套件冲突问题。</p>

<p>如果其中一个碰撞的物理实体被移除,我如何脱离或停止 didBeginContact 运行。
例如:
1 颗子弹与 2 个重叠的敌人相撞。因为子弹击中敌人并被摧毁,对第二个敌人运行的碰撞检查会抛出异常,因为子弹不再存在。</p>

<p>我尝试检查 nil 和 NSNULL 值,但没有成功。
我收到的错误代码是“线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOIP,subcode=0x0)”,在尝试检查类别位掩码时发生(因为鱼雷不再存在)。</p>

<p>代码:</p>

<pre><code>    var bodyA:SKPhysicsBody = contact.bodyA
    var bodyB:SKPhysicsBody = contact.bodyB


    if(contact.bodyA.categoryBitMask == alienCategory &amp;&amp; contact.bodyB.categoryBitMask == alienCategory){
      return
    }


    if((bodyA.categoryBitMask == alienCategory) &amp;&amp; (bodyB.categoryBitMask == photonTorpedoCategory)){
      torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)

    }

    var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
    var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode

    currTorpedo.removeFromParent()
    currAlien.removeFromParent()


}

func torpedoDidCollideWithAlien(alien:SKSpriteNode){

    aliensDestroyed++
    label.text = (&#34;Current Score: &#34; + String(aliensDestroyed))


}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>也许你可以推迟从场景中移除鱼雷,直到下一个场景“更新”。您可以将鱼雷标记为禁用/未激活,这样它就不会影响您的第二个重叠敌人。像这样的:</p>

<pre><code>class YourScene: SkScene {

    // Array of disabled torpedos
    var disabledTorpedos = SKSpriteNode()[]

    func didBeginContact(contact: SKPhysicsContact) {
      var bodyA:SKPhysicsBody = contact.bodyA
      var bodyB:SKPhysicsBody = contact.bodyB


      if(contact.bodyA.categoryBitMask == alienCategory &amp;&amp; contact.bodyB.categoryBitMask == alienCategory){
            return
      }


      if((bodyA.categoryBitMask == alienCategory) &amp;&amp; (bodyB.categoryBitMask == photonTorpedoCategory)){
            torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)

      }

      var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
      var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode

      // Created a new photonTorpedoDisabledCategory so the torpedo cannot hit a 2nd alien
      currTorpedo.physicsBody.categoryBitMask = photonTorpedoDisabledCategory
      disabledTorpedoes.append(currTorpedo)
      // Hide torpedo from scene
      currTorpedo.hidden = true

      currAlien.removeFromParent()
    }

    override func update(currentTime: NSTimeInterval) {

      // loop through disabledTorpedos array and removeFromParent

    }

}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Sprite Kit 碰撞错误 - Swift,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24401101/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24401101/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Sprite Kit 碰撞错误 - Swift