如何使一个节点在接触时消失

How to make one node disappear upon contact

所以目前我正在尝试制作一个应用程序,当玩家与敌人发生碰撞时,敌人就会消失。我通过编写这段代码实现了这一点;

   func didBegin(_ contact: SKPhysicsContact) {
        
        var firstBody = SKPhysicsBody()
        var secondBody = SKPhysicsBody()
    
        if contact.bodyA.node?.name == "Player" {
            
            firstBody = contact.bodyA
            secondBody = contact.bodyB
            
        }else {
            
            firstBody = contact.bodyB
            secondBody = contact.bodyA
            
        }
    if firstBody.node?.name == "Player" && secondBody.node?.name == "Enemy" {
               
           }


if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 2 {
                     
           
           self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
               if node.position.y < 550 || node.position.y >     self.size.height + 550 {

                   node.removeFromParent()
                   
               }
           }
    }

}

但是,因为我正在枚举名称为“Enemy”的 ChildNode,所以每个敌人都会在屏幕上消失。我只希望我击中的那个消失。有什么帮助吗?谢谢!

你需要替换这个:

self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
               if node.position.y < 550 || node.position.y >     
               self.size.height + 550 {
                   node.removeFromParent()        
               }
           }
    }

像这样:

      if contact.bodyA.node?.name == "Enemy" {
        contact.bodyA.node?.removeFromParent()
      } else if contact.bodyB.node?.name == "Enemy" {
        contact.bodyB.node?.removeFromParent()
      }

Contact bodyA 和bodyB 是相互接触的2 个节点。 IF 语句只是检查哪一个是敌人,然后将其删除。

JohnL 发布了正确答案,但您可能会发现像这样构建您的 didBegin 会有所帮助:

  func didBegin(_ contact: SKPhysicsContact) {
     print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")

     let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

     switch contactMask {
     case playerCategory | enemyCategory:
        print("Player and enemy have contacted.")
        let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
        enemyNode.removeFromParent
     default:
        print("Some other contact occurred")
     }
}

(打印语句用于调试,可以去掉)

此代码不会在需要时分配碰撞中的物体,并逻辑与 2 个类别位掩码以确定什么撞到了什么,然后使用 'switch' 处理每次碰撞。您可以为其他碰撞添加额外的开关盒。然后,我们使用三元运算符获取 'enemy' 节点(功能与 JohnL 的“if...then...”相同)并将其删除。