Swift 如果多次触摸,如何从父节点移除节点?

Swift 如果多次触摸,如何从父节点移除节点?,swift,sprite-kit,swift2,Swift,Sprite Kit,Swift2,我正在做一个游戏,当按下按钮时,子弹会射向坏人。我做了一个函数,在这个函数中,无论何时调用它,它都会添加更多的坏人 代码如下:(此方法被多次调用) 我想要这样,如果有两颗子弹与坏人接触,坏人就会被从父母那里除掉 我得到了它,所以当一颗子弹与敌人接触时,它会从母体中移除。(这是代码) 有谁能告诉我,我怎样才能使敌人从父节点上被移除,这样就需要一颗以上的子弹。移除冲突节点的最佳方法是使用方法didFinishUpdate,如果您从didBeginContact中删除或启动一个方法来删除节点,您的游戏

我正在做一个游戏,当按下按钮时,子弹会射向坏人。我做了一个函数,在这个函数中,无论何时调用它,它都会添加更多的坏人

代码如下:(此方法被多次调用)

我想要这样,如果有两颗子弹与坏人接触,坏人就会被从父母那里除掉

我得到了它,所以当一颗子弹与敌人接触时,它会从母体中移除。(这是代码)


有谁能告诉我,我怎样才能使敌人从父节点上被移除,这样就需要一颗以上的子弹。

移除冲突节点的最佳方法是使用方法
didFinishUpdate
,如果您从
didBeginContact
中删除或启动一个方法来删除节点,您的游戏可能会在搜索正在被删除的冲突节点时崩溃

class BadGuy: SKSpriteNode {
   var badGuyBulletCollisionsCounter: Int = 0
   init() {
       let texture = SKTexture(imageNamed: "CircleBadGuy")
       super.init(texture: texture, color: nil, size: texture.size())
       ...
       // fill this part with your BadGuy code
   }
   required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
   }  
}
声明一个全局变量:

var nodesToRemove = [SKNode]()
didBeginContact
方法中:

func didBeginContact(contact: SKPhysicsContact) {
    let A : SKPhysicsBody = contact.bodyA
    let B : SKPhysicsBody = contact.bodyB
    if (A.categoryBitMask == Numbering.Badguy) && (B.categoryBitMask == Numbering.Laser) || (A.categoryBitMask == Numbering.Laser) && (B.categoryBitMask == Numbering.Badguy)
    {
        badGuy = A.node as! BadGuy
        badGuy.badGuyBulletCollisionsCounter += 1
        runAction(BadGuyLostSound)
        bulletsTouchedBadGuy(badGuy, Laser: B.node as! SKSpriteNode)
    }
}
bulletsTouchedBadGuy
方法中:

func bulletsTouchedBadGuy(badGuy: BadGuy, laser: SKSpriteNode){
    nodesToRemove.append(laser)
    if badGuy.badGuyBulletCollisionsCounter == 2 {
       nodesToRemove.append(badGuy)
    }   
}
最后:

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

使用节点的用户数据跟踪其命中状态。当子弹击中坏人时,检查节点的用户数据,看看它是否已经被击中。如果有,将其移除;如果没有,请说明它有:

//Add this when creating BadGuy:
BagGuy.userData = ["HasBeenHit" : false]

    func bulletsTouchedBadGuy(BadGuy: SKSpriteNode, Laser: SKSpriteNode){

        Laser.removeFromParent()

        if BadGuy.userData["HasBeenHit"] == true {
           BadGuy.removeFromParent()
        } else {
           BadGuy.userData["HasBeenHit"] = true
        }
甚至:

        if BadGuy.userData["HasBeenHit"] == true ? BadGuy.removeFromParent() : BadGuy.userData["HasBeenHit"] = true
如果要将
removeFromParent()
移动到
didFinishUpdate()
,只需按如下方式更改操作:

        if BadGuy.userData["HasBeenHit"] == true {
           BadGuy.userData["HasBeenHitTwice"]
        } else {
           BadGuy.userData["HasBeenHit"] = true
        }

然后在
didFinishUpdate()
中删除设置了此值的所有节点,或者根据另一个答案构造要删除的节点数组。

Alessandro-我尝试通过删除didBeginContact中的节点来生成崩溃,但失败了。你见过这种情况吗?有几次,但确实发生过,我过去很不高兴,因为我的游戏在苹果商店里有这个bug。didBeginContact可以被调用很多次,所以它不是删除节点的正确位置。你好,谢谢你回答这个问题,班上的坏蛋:SKSpriteNode必须在我目前工作的班里,还是我必须制作另一个swift文件?如果没有,你能告诉我它去哪里吗?谢谢我这么问是因为badGuypostion方法每0.5秒调用一次,使用NSTimer计划的时间,您可以在同一个文件中生成所有内容,即您的类之上的BadGuy类
        if BadGuy.userData["HasBeenHit"] == true ? BadGuy.removeFromParent() : BadGuy.userData["HasBeenHit"] = true
        if BadGuy.userData["HasBeenHit"] == true {
           BadGuy.userData["HasBeenHitTwice"]
        } else {
           BadGuy.userData["HasBeenHit"] = true
        }