為了便於SpriteKit中物理行為的調試,我們可以借助於Xcode的playground的強大機制.我們只需要隨時修改我們的代碼,就可以在觀察窗中立即觀察到物理對象的變化.
現在為了給眼睛觀察一定延時時間,我們寫一個延時方法:
public func delay(seconds seconds:Double,completion:()->()){
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * seconds))
dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)){
completion()
}
}
然後擴展SKScene類,添加2個新的實例方法:
extension SKScene{
func switchWindDirection(timer:NSTimer){
blowingRight = !blowingRight
windForce = CGVector(dx: blowingRight ? 50:-50, dy: 0)
}
func windWithTimer(timer:NSTimer){
scene!.enumerateChildNodesWithName("sand"){node,_ in
node.physicsBody!.applyForce(windForce)
}
scene!.enumerateChildNodesWithName("shape"){node,_ in
node.physicsBody!.applyForce(windForce)
}
}
}
我們隨著時間左右搖擺場景中的物理對象,模擬大風吹過的效果.
我們還需要找地方調用這兩個方法,首先嘗試在delay中調用:
delay(seconds: 2.0){
NSTimer.scheduledTimerWithTimeInterval(0.05, target: scene, selector: #selector(SKScene.windWithTimer(_:)), userInfo: nil, repeats: true)
NSTimer.scheduledTimerWithTimeInterval(3.0, target: scene, selector: #selector(SKScene.switchWindDirection(_:)), userInfo: nil, repeats: true)
scene.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
}
但是實際上playground中顯示並沒有調用其中對應的方法,後將NSTimer的調用移到delay之外調用卻可以完成效果,這是為何?
原因很簡單,delay中的延時調用是在主隊列中執行的,應該放在main隊列中執行,我們重新寫一個delayInMain方法:
public func delayInMain(seconds seconds:Double,completion:()->()){
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * seconds))
dispatch_after(popTime, dispatch_get_main_queue()){
completion()
}
}
然後在其中調用NSTimer的定時器方法就可以了: