GS.
GS.

Reputation: 123

touchesBegan If Statement Problems

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

Answers (1)

Nicolas Miari
Nicolas Miari

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

Related Questions