如何在Swift中删除一组节点?

时间:2014-12-13 09:14:00

标签: swift sprite-kit

我对Objective c和swift很陌生,我创建了一个小应用程序,其中呈现小圆圈,一旦玩家与圆圈碰撞,游戏结束。我设法让一切工作,但如何在碰撞后删除节点。我试过removeAllChildren(),但没有一个消失。当我使用removeFromParent()时,只有1消失。我想要一种方法来删除将在下面的代码中呈现的所有3个节点

//首先调用addEvilGuys()

func addEvilGuys()
    {
        addEvilGuy(named: "paul", speed: 1.3, xPos: CGFloat(self.size.height/3))
        addEvilGuy(named: "boris", speed: 1.7, xPos: frame.size.width/4 + 50)
        addEvilGuy(named: "natasha", speed: 1.5, xPos: frame.size.width/4 + 150)
    }

    func addEvilGuy(#named:String, speed:Float, xPos: CGFloat)
    {
        evilGuyNode = SKSpriteNode(imageNamed: named)

        evilGuyNode.zPosition = 10
        evilGuyNode.physicsBody = SKPhysicsBody(circleOfRadius: 16)
        evilGuyNode.physicsBody!.affectedByGravity = false
        evilGuyNode.physicsBody!.categoryBitMask = ColliderType.BadGuy.rawValue
        evilGuyNode.physicsBody!.contactTestBitMask = ColliderType.Hero.rawValue
        evilGuyNode.physicsBody!.collisionBitMask = ColliderType.Hero.rawValue

        evilGuyNodeCount++

        var evilGuy = EvilGuy(speed: speed, eGuy: evilGuyNode)
        evilGuys.append(evilGuy)
        resetEvilGuy(evilGuyNode, xPos: xPos)
        evilGuy.xPos = evilGuyNode.position.x
        addChild(evilGuyNode)
    }

    func resetEvilGuy(evilGuyNode:SKSpriteNode, xPos:CGFloat)
    {
        evilGuyNode.position.y = endOfScreenBottom
        evilGuyNode.position.x = xPos
    }

1 个答案:

答案 0 :(得分:2)

addEvilGuy中,您正在重新创建存储的属性(即整个类可见,+访问级别允许的任何内容),以创建您正在添加的SKSpriteNode。这意味着您正在孤立以前创建的EvilGuy

addEvilGuy中,替换

evilGuyNode = SKSpriteNode(imageNamed: named)

let evilGuyNode = SKSpriteNode(imageNamed: named)

并从您的班级中移除该属性(看起来您似乎不需要在更大的范围内)。

看起来您还在创建EvilGuy并将它们存储在数组中,这很好。因此,当您可以使用以下功能从屏幕上删除所有这些内容时:

func removeAllEvilGuys(evilGuys: [EvilGuy]) {
  for evilGuy in evilGuys {
    evilGuy.eGuy.removeFromParent()
  }
}

作为最佳做法建议,因为您提到您是初学者:

  1. 我建议在.plist中定义邪恶家伙的特征,然后使用该文件创建一个邪恶的家伙阵列。通过这种方式,您可以轻松地更改该文件中的邪恶人物,而无需更改代码中的任何内容。

  2. 创建EvilGuy对象的代码应该与将恶魔添加到屏幕的代码分开。只要您存储每个SKNode的SKNode,您就可以添加/删除而无需重新创建整个对象。