2016-04-29 25 views
1

スウィフト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で敵と呼ばれるすべてのスプライト必要があります。あなたが現在のスプライトの速度を参照することになっています場合は、あなたのEnemySpeed変数について何かを行う必要があるでしょう

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

      // Your enemy movement/update code here 

     } 

をこれは単なるインスタンス変数であり、そのスプライトのプロパティではないため、処理します。あなたは、おそらくあなたが必要とする速度にこれを変換することCGVectorあるEnemy.physicsBody.velocityを、使用することをお勧めします:

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

また、あなたの命名基準を確認してください。ほとんどのものはそうEnemyenemyOriginalEnemySpeedがあるべきであるべきキャメルケースでなければならないoriginalEnemySpeedなど

+0

あなたはより多くのCGVectorになるために私のenemySpeedを変更する方法について詳しく説明することはできますか?私は敵がプレーヤーを追いかけることを望みます。プレーヤーがさらに進むにつれて速くなる現状ではなく、一定のスピードでプレイしてください。 –

関連する問題