Xcode的playground中对于SpriteKit物理对象的更新为何无效

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)

为了便于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的定时器方法就可以了:

你可能感兴趣的:(xcode,playground,SpriteKit,物理对象)