【问题标题】:SKPhysicsContact not contacting enemy with bulletSKPhysicsContact 没有用子弹接触敌人
【发布时间】:2021-11-30 16:29:31
【问题描述】:

我希望我的 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

【问题讨论】:

  • “我已经正确设置了我的 categorybitmasks”谁知道呢?
  • 你有接到电话吗?您是否忘记设置联系人代表?
  • 将 print("didBegin:entered") 作为didBegin(contact:) 的第一行,以便您知道是否有任何联系人正在注册。您是否已完成接触检测所需的所有其他工作? stackoverflow.com/a/51041474/1430420
  • 已设置联系人代表。打印后没有任何内容被回调。他们之间肯定有冲突,只是接触后没有注册。
  • 您可以确定的一件事是,如果没有调用 didBegin,那么您没有正确设置联系人 - 它永远不会“不起作用”。跨度>

标签: swift sprite-kit


【解决方案1】:

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

在你的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 值的升序分配第一个和第二个正文。

您可以确认这是否与 if 块内的另一个 print 一起使用。

我从来没有真正喜欢过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")
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多