2016-10-13 6 views
2

は、ここに私のコードです:(SWIFT +のSpriteKitベース)

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    let origin = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 

    let delay = SKAction.waitForDuration(2.0) 

    for (var i = 0; i < 6; i++) { 
     //generate a random point on a circle centered at origin with radius of 500 
     let point = randomPointOnCircle(500, center: origin) 

     let chanceToSpawn = arc4random_uniform(100) 

     switch chanceToSpawn { 

     case 0...60: 

      self.runAction(delay){ 
       let smallBall = SKSpriteNode(imageNamed: "smallBall”) 
       self.addChild(smallBall) 
       smallBall.xScale = 0.05 
       smallBall.yScale = 0.05 
       smallBall.position = point 

       let finalDest = CGPointMake(origin.x, origin.y) 
       let moveAction = SKAction.moveTo(finalDest, duration: 5.0) 
       smallBall.runAction(SKAction.sequence([SKAction.waitForDuration(0.1), moveAction, SKAction.runBlock({ 
        smallBall.removeFromParent() 
       })])) 
       delay 
      } 

      break 

     case 61...80: 
      //same as case 0…60, smallBall changed to “mediumBall” 
      break 
     case 81...99: 
      //same as case 0…60, smallBall changed to “largeBall” 
      break 
     default: 
      break 
     } // ends switch statement 
    }//ends for loop 



}//end didMoveToView 

基本的に私は円上のランダムな点に出現ボールを持っており、中心に向かって移動します。しかし、私が抱えている問題は、どのように並べ替えても(つまり、異なるループを試したり、ボールの動きやボールの動きを定義して、単にswitch文の中から呼び出すなど)何を並べ替えてもボールが同時に出現する。私はそれを作るようにしています(ボールが発生し、スレッドが数秒待ってから別のボールを生み出すということを意味します)、なぜボールが同じようにスポーンしているのか分かりません他のすべてのボールと同じ時間。

私はかなりSwift/Spritekitプログラミングの新人です。私はいくつかの細部を見落としているように感じており、これは本当に私を悩ましています。どんな助けにも感謝!

答えて

1

を試してみてください、これを試してみてくださいは、あなたが考えるよりも速く実行されます!あなたのforループはたぶん実行されるでしょう。

"なぜですか?私はすでにself.runAction(delay)を呼び出してforループを遅延させました!"あなたは尋ねました。さて、遅延アクションは実際にはforループを遅らせるわけではありません。 selfで実行する他のアクションを遅らせるだけです。この問題を解決するには

、ループカウンタ用のdependindを異なる量を遅らせてみてください。

self.runAction(SKAction.waitForDuration(i * 2 + 2)) { ... } 

この方法で、ボールは2秒ごとに表示されます。

+0

それは働きました!どうもありがとうございます!私が遭遇した問題は、変数iが二重であることを明示的に宣言しなければならないということでしたが、それ以外はうまくいっています!再度、感謝します! :D –

1

による同じ時間にuは、それぞれのボールのアクションを追加することも、

smallBall.runAction(SKAction.sequence([SKAction.waitForDuration(0.1 + (i * 0.35/2)), moveAction, SKAction.runBlock({ 
       smallBall.removeFromParent() 
      })])) // delay added (0.1 + (increment the daly)) 

がループの場合、この

0

あなたの問題は、forループの各繰り返しでrunActionを呼び出すことです。これは、すべてのアクションが同時に実行されることを意味します。

アクションの配列を作成します。 forループの後に一連のアクションを実行します。

(注:私はあなたのコードをクリーンアップの自由を取った)

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    let origin = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 

    let delay = SKAction.waitForDuration(2.0) 
    var sequence = [SKAction]() 
    for (var i = 0; i < 6; i++) { 
     //generate a random point on a circle centered at origin with radius of 500 
     let point = randomPointOnCircle(500, center: origin) 

     let chanceToSpawn = arc4random_uniform(100) 
     var ballname = "smallBall” 
     switch chanceToSpawn { 


     case 61...80: 
      //same as case 0…60, smallBall changed to “mediumBall” 
      ballname = "mediumBall” 

     case 81...99: 
      //same as case 0…60, smallBall changed to “largeBall” 
      ballname = "largeBall” 

     default:() 
     } // ends switch statement 

     sequence.append(delay) 
     sequence.append(
      SKAction.run() 
      { 
       [unowned self] in 
       let ball = SKSpriteNode(imageNamed: ballName) 
       self.addChild(ball) 
       ball.xScale = 0.05 
       ball.yScale = 0.05 
       ball.position = point 

       let finalDest = CGPointMake(origin.x, origin.y) 
       let moveAction = SKAction.moveTo(finalDest, duration: 5.0) 
       let briefWait = SKAction.waitForDuration(0.1) 
       let remove = SKAction.removeFromParent() 
       let moveSeq = SKAction.sequence([briefWait ,moveAction,remove]) 
       ball.runAction(moveSeq) 

      } 
     ) 
    }//ends for loop 


    self.run(SKAction.sequence(sequence)) 
}//end didMoveToView 
関連する問題