2016-04-29 86 views
1

Swift 2 SpriteKit如何控制具有相同名称的多个精灵套件节点?

因此,我使用下面的代码随机产生敌人,然后将其移向玩家。但由于某种原因,只有第一个敌人向着这个玩家移动,其他的什么都不做。我是新手,所以所有的细节都会有所帮助。

在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)) 

在更新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 
      } 

回答

3

childNodeWithName("Enemy")只会拿起现场的第一精灵叫Enemy

您需要循环所有精灵叫敌人enumerateChildNodesWithName

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

      // Your enemy movement/update code here 

     } 

你必须做一些事情你EnemySpeed变量,如果它应该指的是你目前精灵的速度处理,因为它只是一个单一的实例变量而不是该精灵的属性。您可能需要使用Enemy.physicsBody.velocity,这是一个CGVector,所以将其转换到你所需要的速度:

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

还要检查你的命名标准;大部分东西应该是骆驼案例Enemy应该是enemy,OriginalEnemySpeed应该是originalEnemySpeed

+0

你能详细说说怎样修改我的enemySpeed成为CGVector吗?我只希望敌人追逐玩家,最好是以一种恒定的速度,而不是现在的情况,当玩家进一步变得更快时,他们会变得更快。 –

相关问题