2016-02-25 78 views
0

我正在嘗試編寫一個例程來擲骰子。在登陸最終號碼之前,我想讓臉部改變幾次。下面的代碼不會顯示換模的面孔。我添加了睡眠聲明,希望它能給它更新的時間,但它只是保持初始狀態直到結束,然後顯示最後一張臉。在更改紋理以強制更新視圖後是否添加語句?加載圖像時不更新直到結束

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) 
    } 
} 
+0

直到函數退出後的某個時候,屏幕纔會繪製。您需要設置模具面,然後設置一個計時器以便稍後更新下一個面並允許該功能退出。如果不這樣做,死亡總是會顯示你設定的最後一張臉。 – BergQuester

+0

爲什麼你把當前的線程睡覺?我想這是主線程?應用程序應該儘可能地進行響應(按照文檔)。你在使用SpriteKit嗎?如果是這樣,請使用SKAction或update:方法及其傳遞的與時間相關的action的curentTime參數。 – Whirlwind

回答

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) 
      } 
     } 
    } 
} 
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() 
    } 
} 
相關問題