2016-04-29 45 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嗎?我只希望敵人追逐玩家,最好是以一種恆定的速度,而不是現在的情況,當玩家進一步變得更快時,他們會變得更快。 –

相關問題