无法使用 removeFromParent 删除点击的 spriteNode:Swift

Can't remove tapped spriteNode using removeFromParent : Swift

我有一个 for 循环可以实例化 5 个精灵

for enemy in 1...5 {
    negativeOnComing = SKSpriteNode(imageNamed: "Enemy3")
    negativeOnComing.physicsBody = SKPhysicsBody(circleOfRadius: negativeOnComing.frame.size.width/2)
    negativeOnComing.physicsBody?.dynamic = true
    negativeOnComing.physicsBody?.categoryBitMask = PhysicsCategory.negativeOncoming
    negativeOnComing.physicsBody?.fieldBitMask = PhysicsCategory.negativeOncoming
    negativeOnComing.physicsBody?.contactTestBitMask = PhysicsCategory.mainCenterNode | PhysicsCategory.positiveOncoming
    negativeOnComing.physicsBody?.node?.name = "negativeOnComing"
self.addChild(negativeOnComing)

} 我已经将变量全局声明为

var negativeOnComing : SKSpriteNode!

现在我希望能够在点击后删除被点击的精灵。为了尝试这个,我做了

 func removeNegativeOncoming(negativeOnComingR:SKSpriteNode){
    println("Tapped")
    childNodeWithName("negativeOnComing")?.removeFromParent()
       }


override func touchesBegan(touches: NSSet, withEvent event: UIEvent){
    var touch = touches.anyObject() as UITouch
    var touchPosition = touch.locationInNode(self)
    var enemyNodePosition = negativeOnComing.childNodeWithName("negativeOnComing")?.position
    var enemyNodeFrame = negativeOnComing.frame
   func removeEnemyNode (UITouch) -> SKSpriteNode {
        if (enemyNodeFrame.contains(touchPosition) ) {
            removeNegativeOncoming(negativeOnComing)
        }
        return negativeOnComing
    }
    mainSpriteMovement(touch)

}

现在这个函数实际上确实移除了精灵,但是,它并没有移除恰好被点击的精灵,而是随机移除了 5 个精灵中的一个。我的问题是我怎样才能只删除被点击到我身上的精灵,而不仅仅是 5 个中的随机精灵。希望这个问题问得很好并且可以理解。谢谢大家

你正在创建 5 个敌人,但每次都设置 negativeOnComing,所以这个变量最终只会保存对最后创建的节点的引用。

但是,这不是您遇到问题的原因。您正在使用 childNodeWithName 来查找要删除的节点 - 但您所有的敌人节点都具有相同的名称,因此您随机获得一个。

您可以简单地使用 nodeAtPoint 来确定哪个节点被点击 -

override func touchesBegan(touches: NSSet, withEvent event: UIEvent){
    var touch = touches.anyObject() as UITouch
    var touchPosition = touch.locationInNode(self)
    var touchedNode = self.nodeAtPoint(touchPosition)
    if (touchedNode.name == "negativeOnComing") {
        touchedNode.removeFromParent()
    }
    mainSpriteMovement(touch)

}