在将节点从屏幕上移除之前,我如何要求在其中一个节点上发生两次碰撞?

How can I require two collisions on one of my nodes before removing it from screen?

我有一款基于碰撞的游戏,使用导弹和炸弹。现在一切正常,只有 1 次碰撞,它会从屏幕上删除节点。

虽然我希望能够让我的 "bombs" 的炸弹 1 更难摧毁,所以我想要求它被击中两次。我该怎么做?

这是炸弹

func enemies() {

    let bomb1 = SKSpriteNode(imageNamed: "Bomb1")
    let bomb2 = SKSpriteNode(imageNamed: "bomb2")
    let bomb3 = SKSpriteNode(imageNamed: "Bomb3")
    let enemy = [bomb1, bomb2, bomb3]

    // Enemy Physics
    for bomb in enemy {
        bomb1.size = CGSize(width: 55, height: 55)
        bomb2.size = CGSize(width: 55, height: 70)
        bomb3.size = CGSize(width: 30, height: 30)
        bomb.physicsBody = SKPhysicsBody(circleOfRadius: bomb.size.width / 4)
        bomb.physicsBody?.categoryBitMask = PhysicsCategory.enemy
        bomb.physicsBody?.collisionBitMask = PhysicsCategory.missile | PhysicsCategory.airDefense
        bomb.physicsBody?.contactTestBitMask = PhysicsCategory.missile | PhysicsCategory.airDefense
        bomb.physicsBody?.affectedByGravity = false 
        bomb.physicsBody?.dynamic = true
        bomb1.name = "enemy1"
        bomb2.name = "enemy2"
        bomb3.name = "enemy3"

    }

这是炸弹击中导弹时调用的函数。

 func collisionWithMissile(enemy : SKSpriteNode, missile : SKSpriteNode) {
    enemy.physicsBody?.dynamic = true
    enemy.physicsBody?.affectedByGravity = true
    missile.physicsBody?.affectedByGravity = true

    enemy.physicsBody?.mass = 10.0
    missile.physicsBody?.mass = 5.0

    enemy.removeAllActions()
    missile.removeAllActions()

    enemy.removeFromParent()
    missile.removeFromParent()

    enemy.physicsBody?.contactTestBitMask = 0
    enemy.physicsBody?.collisionBitMask = 0
    enemy.name = nil

    score++
    scoreLbl.text = "\(score)"

}

这可能有助于解决我收到的错误

func didBeginContact(contact: SKPhysicsContact) {
    if contact.bodyA.node != nil && contact.bodyB.node != nil {
        let firstBody = contact.bodyA.node as! Bomb
        let secondBody = contact.bodyB.node as! SKSpriteNode

        // Bomb1 **********
        if ((firstBody.name == "enemy1") && (secondBody.name == "missile")) {

            collisionWithMissile(firstBody, missile: secondBody)
            atomicExplosion(contact.bodyA.node!.position)
            missileExplosion(contact.bodyB.node!.position)

        }

您可以为您的炸弹子class SKSpriteNode 并为此class 添加一个碰撞计数器。在你的 collisionWithMissile 函数中,你检查这个计数器的值,如果达到给定值则移除炸弹,否则你增加计数器。

你的子class可以看起来像这样

class Bomb: SKSpriteNode {
  var hitCount: Int

  init(imageNamed: String, hitCount: Int) {
    self.hitCount = hitCount
    let texture = SKTexture(imageNamed: imageNamed)
    super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

init方法有hitCount作为参数,所以你可以很容易地创建不同强度的炸弹。您的 collisionWithMissile 方法可能是这样的。只需用您需要的代码填写 if-else 部分。

func collisionWithMissile(enemy : Bomb, missile : SKSpriteNode) {
  if enemy.hitCount <= 0 {
      enemy.removeFromParent()
  } else {
      enemy.hitCount -= 1
  }
}