Reputation: 123
I'm trying to detect whether or not a node is an enemy or not. If it is, I want to remove it. I'm attempting to use the touched nodes name to detect this. I am able to detect whether or not the node's name is enemy, but I don't know how to remove it. Thanks for the help! :)
Here's all relevant code:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first!
let location = touch.location(in: self)
let nodes = self.nodes(at: location);
let name = nodes.first?.name;
if (name == "enemy") {
nodes.removeFromParent() // this doesn't work
}
}
@objc open func spawnEnemies() {
let randomNumber = randomBetween(min: Int(-150), max: Int(self.frame.width + 150))
print(randomNumber)
print(self.frame.width)
var enemy = SKSpriteNode(imageNamed: "triangle")
enemy.position = CGPoint(x: CGFloat(randomNumber), y: self.frame.height + 250)
enemy.name = "enemy";
enemy.zPosition = 6.0;
enemy.physicsBody?.allowsRotation = false
enemy.zRotation = 0
enemy.physicsBody?.affectedByGravity = false
enemy.physicsBody = SKPhysicsBody(texture: enemy.texture!, size: enemy.texture!.size())
enemy.physicsBody?.affectedByGravity = false
enemy.physicsBody?.isDynamic = true
enemy.physicsBody?.categoryBitMask = enemyCategory
enemy.physicsBody?.collisionBitMask = blockerCategory
enemy.physicsBody?.contactTestBitMask = blockerCategory
enemy.setScale(CGFloat(0.03))
addChild(enemy)
}
Upvotes: 1
Views: 47
Reputation: 16246
This part of your code is problematic:
let nodes = self.nodes(at: location);
let name = nodes.first?.name;
if (name == "enemy") {
nodes.removeFromParent() // this doesn't work
}
Your variable nodes
is an array of SKNode
instances; it doesn't make any sense to call the SKNode
method removeFromParent()
on the whole array (only on its individual elements).
You have successfully tested the name of the .first
element; do the same to remove it:
let nodes = self.nodes(at: location);
let name = nodes.first?.name;
if (name == "enemy") {
nodes.first?.removeFromParent()
}
Or perhaps a better apporach (removes multiple enemies in one round):
for node in self.nodes(at: location) {
if node.name == "enemy" {
node.removeFromParent()
}
}
Finally, a more "swifty" version of the code above:
nodes.filter({ (node) -> Bool in
return node.name == "enemy"
}).forEach({ (enemy) in
enemy.removeFromParent()
})
Upvotes: 1