首页 > 解决方案 > SKPhysicsContact 没有用子弹接触敌人

问题描述

我希望我的 categorybitmasks 设置正确,但我下面的代码应该让我的子弹和敌人接触,然后相互删除。什么都没有发生,它们只是碰撞并仍然留在屏幕上

func didBeginContact(联系人:SKPhysicsContact!){

  var firstBody: SKPhysicsBody!
  var secondBody: SKPhysicsBody!

  if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
    firstBody = contact.bodyA
    secondBody = contact.bodyB
  }
  else {
    firstBody = contact.bodyB
    secondBody = contact.bodyA
  }

  if (firstBody.categoryBitMask & bulletCategory) != 0 &&
    (secondBody.categoryBitMask & enemyCategory) != 0 {
        destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
  }
}

func destroyEnemy(bullet: SKSpriteNode, enemy: SKSpriteNode) {
  
  bullet.removeFromParent()
  enemy.removeFromParent()
}
    enemy.physicsBody?.categoryBitMask = CollisionTypes.enemy.rawValue
    enemy.physicsBody?.contactTestBitMask = CollisionTypes.bullet.rawValue
    enemy.physicsBody?.collisionBitMask = CollisionTypes.bullet.rawValue

bullet.physicsBody?.categoryBitMask = CollisionTypes.bullet.rawValue bullet.physicsBody?.contactTestBitMask = CollisionTypes.enemy.rawValue bullet.physicsBody?.collisionBitMask = CollisionTypes.enemy.rawValue

标签: swiftsprite-kit

解决方案


这本身不是答案,但评论有点长:

在你的didBegin你有:

if (firstBody.categoryBitMask & bulletCategory) != 0 &&
    (secondBody.categoryBitMask & enemyCategory) != 0 {
        destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)

如果 firstBody 是敌人而 secondBody 是子弹会发生什么?似乎发生联系时要运行的代码不会触发。如果没有看到您的 categoryBitMask 定义,我们将不知道,因为您似乎是按 categoryBitMask 值的升序分配第一个和第二个正文。

您可以确认这是否与块print内的另一个一起工作if

我从来没有真正喜欢过这种形式,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 bulletCategory | enemyCategory:
        print("bullet and enemy have contacted.")
        let bulletNode = contact.bodyA.categoryBitMask == bulletCategory ? contact.bodyA.node : contact.bodyB.node
        let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
        destroyEnemy(bullet: bulletNode, enemy: enemyNode)
     case playerCategory | enemyCategory:
        // Handle player/Enemy collisions
     default:
        print("Some other contact occurred")
     }

推荐阅读