Reputation: 115
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
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