你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Xcode的playground中對於SpriteKit物理對象的更新為何無效

Xcode的playground中對於SpriteKit物理對象的更新為何無效

編輯:IOS開發綜合

為了便於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的定時器方法就可以了:

這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved