2

これが私のコードです:

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 プログラミングにかなり慣れていないので、細部を見落としているように感じます。これは本当に私を悩ませています。どんな助けでも大歓迎です!

4

3 に答える 3

1

for ループは、思ったよりも速く実行されます。あなたの for ループはおそらく即座に実行されます。

「それはなぜですか? self.runAction(delay)for ループを遅らせるために既に呼び出しました!」あなたは尋ねました。残念ながら、遅延アクションは実際には for ループを遅延させません。実行する他のアクションを遅らせるだけですself

これを修正するには、for ループ カウンターに応じて、さまざまな量の遅延を試してください。

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

このように、ボールは 2 秒ごとに表示されます。

于 2016-10-13T06:11:23.940 に答える
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
于 2016-10-13T13:58:33.973 に答える