A. Tohamy
A. Tohamy

Reputation: 115

How to control multiple sprite kit nodes with the same name?

Swift 2 SpriteKit

So I'm using the following code to spawn enemies randomly and then to move them towards the player. But for some reason, only the first enemy moves towards the player, the rest do nothing. I'm new to this so all details would help.

Under didmovetoview:

        let wait = SKAction.waitForDuration(3, withRange: 2)
        let spawn = SKAction.runBlock {
            let Enemy = SKSpriteNode(imageNamed: "Enemy.png")
            Enemy.size.height = (70) //138
            Enemy.size.width = (49) //99
            Enemy.position = CGPointMake(CGRectGetWidth(self.frame) - 100 , CGRectGetHeight(self.frame) - 100)
            Enemy.physicsBody = SKPhysicsBody (rectangleOfSize: Enemy.size)
            Enemy.physicsBody!.dynamic = true
            Enemy.physicsBody!.allowsRotation = false
            Enemy.physicsBody!.friction = 0
            Enemy.physicsBody!.restitution = 0
            Enemy.physicsBody!.linearDamping = 1
            Enemy.physicsBody!.angularDamping = 1
            Enemy.name = "Enemy"
            Enemy.zPosition = 3
            self.addChild(Enemy)
            self.EnemyExists=true

        }
        let sequence = SKAction.sequence([wait, spawn])
        self.runAction(SKAction.repeatActionForever(sequence))

Under update func:

            let Enemy = childNodeWithName("Enemy") as! SKSpriteNode
            let Player = childNodeWithName("Player") as! SKSpriteNode

            if EnemySpeed == OriginalEnemySpeed {

                let impulseVector = CGVector(dx: (Player.position.x - Enemy.position.x)/200, dy: (Player.position.y - Enemy.position.y)/200)
                Enemy.physicsBody?.applyImpulse(impulseVector)
            }

            if Enemy.position.x + Enemy.size.width / 4 > size.width {
                Enemy.position.x = Enemy.size.width / 4

            }
            else if Enemy.position.x + Enemy.size.width / 4 < 0 {
                Enemy.position.x = size.width - Enemy.size.width / 4

            }

            if Enemy.position.y + Enemy.size.height / 4 > size.height {
                Enemy.position.y = Enemy.size.height / 4

            }
            else if Enemy.position.y + Enemy.size.height / 4 < 0 {
                Enemy.position.y = size.height - Enemy.size.height / 4

            }

            EnemySpeed-=1
            if EnemySpeed < 1 {
                EnemySpeed = OriginalEnemySpeed
            }

Upvotes: 2

Views: 1216

Answers (1)

Steve Ives
Steve Ives

Reputation: 8134

childNodeWithName("Enemy") will only pick up the first sprite in the scene called Enemy.

You need to loop over all sprites called enemy with enumerateChildNodesWithName:

        enumerateChildNodesWithName("Enemy") {
            node, stop in
            let Enemy = node as! SKSpriteNode

            // Your enemy movement/update code here

        }

You'll have to do something about your EnemySpeed variable if it's supposed to refer to the speed of the sprite you are currently processing, as it's just a single instance variable and not a property of that sprite. You'll probably want to use Enemy.physicsBody.velocity, which is a CGVector, so to convert this to a speed you need:

enemySpeedX = enemy.physicsbody.velocity.dx
enemySpeedY = enemy.physicsbody.velocity.dy
enemySpeed = sqrt(enemySpeedX* enemySpeedX + enemySpeedY* enemySpeedY)

Also check your naming standards; most things should be camel-case so Enemy should be enemy, OriginalEnemySpeed should be originalEnemySpeed etc.

Upvotes: 3

Related Questions