大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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的定时器方法就可以了: