0

サイコロを振るルーチンを書こうとしています。最終的な数字に着地する前に、顔を数回変更したいと思います。以下のコードは、面が変化するダイを示していません。更新する時間を与えることを期待して sleep ステートメントを追加しましたが、最後まで最初の顔にとどまり、最終的な顔を表示します。ビューを強制的に更新するためにテクスチャを変更した後に追加するステートメントはありますか?

func rollDice() {
    var x: Int
    for var i = 0; i < 50; i++
    {
        x = GKRandomSource.sharedRandom().nextIntWithUpperBound(6)

        let texture = dice[0].faces[x]
        let action:SKAction = SKAction.setTexture(texture)

        pieces[3].runAction(action)


        pieces[3].texture = dice[0].faces[x]
        NSThread.sleepForTimeInterval(0.1)
        print(x)
    }
}
4

2 に答える 2

0

お手伝いありがとう。タイマーについていくつか読んだ後、次のコードを思いつきました。

func rollDice() {
    rollCount = 0
    timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target:self, selector: "changeDie", userInfo: nil, repeats: true)
}

func changeDie () {
    x = GKRandomSource.sharedRandom().nextIntWithUpperBound(6)
    print(x)
    let texture = dice[0].faces[x]
    let action:SKAction = SKAction.setTexture(texture)
    pieces[3].runAction(action)
    ++rollCount
    if rollCount == 20 {
        timer.invalidate()
    }
}
于 2016-02-27T05:06:28.957 に答える
0

コメントで指摘されているように、画面はメインスレッドでのみ再描画されます。したがって、バックグラウンド スレッドでサイコロを振って、メイン スレッドで画面を再描画することができます。

func rollDice() {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
        for i in 0..<50 {
            let x = GKRandomSource.sharedRandom().nextIntWithUpperBound(6)

            dispatch_async(dispatch_get_main_queue) {
                let texture = dice[0].faces[x]
                let action:SKAction = SKAction.setTexture(texture)

                pieces[3].runAction(action)

                pieces[3].texture = dice[0].faces[x]
                NSThread.sleepForTimeInterval(0.1)
                print(x)
            }
        }
    }
}
于 2016-02-25T22:01:04.343 に答える