删除与播放器精灵发生冲突的节点

时间:2016-07-07 07:07:35

标签: xcode swift sprite-kit

我试图在玩家与它发生碰撞时在一个世界节点中包含的levelUnit中删除名为“specialObstacle”的节点,但它成功但我在多个级别中有多个名为“specialObstacle”的节点一旦玩家与一个玩家发生碰撞,所有单位都被移除。我试图让玩家碰撞的那个只被删除。我的代码如下:

删除代码(也放在联系人代码中):

 func createSpecialObject() {


        objectSprite = SKSpriteNode(imageNamed:imageName)
        self.addChild(objectSprite)

        objectSprite.physicsBody = SKPhysicsBody(circleOfRadius: objectSprite.size.width / 3)
        objectSprite.physicsBody!.categoryBitMask = BodyType.specialObjectDiamond.rawValue
        objectSprite.physicsBody!.contactTestBitMask = BodyType.specialObjectDiamond.rawValue

  }

        objectSprite.physicsBody!.friction = 1
        objectSprite.physicsBody!.dynamic = false
        objectSprite.physicsBody!.affectedByGravity = false
        objectSprite.physicsBody!.restitution = 0.0
        objectSprite.physicsBody!.allowsRotation = false

        self.zPosition = 400

    self.name = "specialObstacle"

    self.position = CGPointMake(objectSprite.size.width / 2 ,  0)

}

障碍代码:(在自己的类中称为Object:SKnode)

 func didBeginContact(contact: SKPhysicsContact) {

   if (contact.bodyA.categoryBitMask == BodyType.player.rawValue && contact.bodyB.categoryBitMask == BodyType.specialObjectCoin.rawValue ) {

        **REMOVAL CODE HERE**

        numberOfCoins += 1
        print("number of Coins collected is \(numberOfCoins)")

    }

     else if (contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue  && contact.bodyB.categoryBitMask == BodyType.player.rawValue  ) {

       **REMOVAL CODE HERE**

        numberOfCoins += 1
        print("number of Coins collected is \(numberOfCoins)")

    }
 }

联系代码:

{{1}}

我真的不知道如何让它只移除我的玩家碰撞的节点而不是等级单位中与#34; specialObstacle"同名的所有其他障碍物。被删除。请问有人能够深入了解我做错了什么吗?

2 个答案:

答案 0 :(得分:3)

您永远不想在didBeginContact阶段删除。您可以输入一个位置,在该位置删除与2个对象冲突的节点,在第一个对象上删除,然后在检查第二个对象上,由于对象不存在而导致程序崩溃。相反,您需要排队要删除的所有节点,并在didFinishUpdate阶段

期间删除它们
var nodesToRemove = [SKNode]()

override func didBeginContact() 
{

    if (contact.bodyA.categoryBitMask == BodyType.player.rawValue && contact.bodyB.categoryBitMask == BodyType.specialObjectCoin.rawValue ) 
    {

        **REMOVAL CODE HERE**
        nodesToRemove.append(contact.bodyB.node)
        numberOfCoins += 1
        print("number of Coins collected is \(numberOfCoins)")

    }

     else if (contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue && contact.bodyB.categoryBitMask == BodyType.player.rawValue  ) 
     {

       **REMOVAL CODE HERE**
        nodesToRemove.append(contact.bodyA.node)
        numberOfCoins += 1
        print("number of Coins collected is \(numberOfCoins)")

    }  
}

override func didFinishUpdate() 
{   
     nodesToRemove.forEach(){$0.removeFromParent()}   
     nodesToRemove = [SKNode]()

}

答案 1 :(得分:0)

当调用didBeginContact时,会给出2个碰撞的节点,因此很容易删除正确的节点:

    func didBeginContact(contact: SKPhysicsContact) {

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

       switch contactMask

       case BodyType.player.rawValue | BodyType.specialObjectCoin.rawValue :

          // The player and the coin have contacted
          let coin = contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue ? contact.bodyA.node! : contact.bodyB.node!
          coin.removeFromParent()
          numberOfCoins += 1
          print("number of Coins collected is \(numberOfCoins)")

       default:
          print("Other contact detected")
    }