且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如果触摸不止一次,如何从父节点删除节点?

更新时间:2023-02-02 08:06:53

删除冲突节点的***方法是使用didFinishUpdate方法,如果要删除或启动从didBeginContact游戏中删除节点的方法可能会因为搜索正在被移除的碰撞节点而崩溃.

The best way to remove your collided nodes is using the method didFinishUpdate, if you remove or launch a method to remove your node from didBeginContact your game could crash searching a collided node that meanwhile is in the process of being removed..

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]()
}