无法使用 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)
}
我有一个 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)
}