2017-07-18 116 views
1

我正在使用代表球的SKspritenode。我正忙着做的是我想要球在每個時間間隔後改變顏色。隨時間間隔生成隨機顏色

override func update(_ currentTime: TimeInterval) { 

    ball.color = UIcolor.random() 

    } 

我想說,代碼的作品足以改變顏色。但問題在於每個Frame女巫的顏色變化比我計劃的顏色變化要快得多,就像每2秒鐘一樣。

我解決此問題的是下面列出

var relative = 300 

var Time = 0 { 

    didSet { 

     if Time == relative { 

      ball.color = UIColor.random() 
     } 
    } 
} 

override func update(_ currentTime: TimeInterval) { 

    PT.run(SKAction.moveTo(x: ball.position.x, duration: 0.5)) 

    Time += 1 

    if Time == relative { 

     Time = 0 
    } 
} 

所以這段代碼的目的是改變顏色每次== 300而值時間是每幀更新。那麼時間值會重置= 0時,它達到300

這樣我可以改變後,秒而不是每一幀的顏色。

這種設計可能看起來便宜且沒有經驗的編碼和設置功能的運行方式。這就是爲什麼我要求任何有經驗的程序員幫助我構建一個更好的方法來設計這個邏輯。我對功能和工作原理都很陌生,所以如果你們中的任何一位能夠學習如何編寫一個可運行的或者自帶功能的代碼,而不依賴於像「Override function Update」這樣的「Swift內置功能」,

回答

0

你可以使用一個簡單的模數 if currentTime % 300 == 0 { ball.color = UIColor.random() }

0

如果你想改變的東西有一個特定的時間,你可以計算出增量時間第一和總和,爲了創造一個「實時」定時器。增量時間是自上次調用更新方法以來所經歷的時間,它是更新實體和組件的常用方法。

在值超過例如1000ms後,只需調用隨機顏色函數並重置計時器即可。

//prevent from starting with a 0 time interval by using optional 
var lastUpdateTimeInterval: CFTimeInterval? 
var timer: CFTimeInterval = 0.0 
override func update(_ currentTime: TimeInterval) { 
    var delta: CFTimeInterval = 0.0 
    if let luti = lastUpdateTimeInterval { 
     delta = currentTime - luti 
    } 

    //use delta for update logic like entitys.update(delta) 
    timer += delta 

    if timer > 1 { //after 1s 
     ball.color = UIColor.random() 
     timer = 0.0 //reset timer 
    } 

    lastUpdateTimeInterval = currentTime 
} 
+0

沒有工作。我猜它是因爲計時器沒有被分配任何值 – user3211359

+0

@ user3211359'var timer:CFTimeInterval = 0.0'是一個賦值,'timer + = delta'的確將增量添加到它。如果你沒有增量時間,你不會正確傳遞當前時間。 – BennX

+0

我確實分配了定時器。問題是,計時器看起來有點像這樣 0.0166666669974802 - luti 26790.488545286 - delta – user3211359