问题描述
SKScene 有一个 update(_ delta: TimeInterval)
函数供每帧使用。我想知道如何为自定义 SKNode 做到这一点?
用例是我正在创建一个 SKScrollView,当用户拖过滚动视图的边缘时它会反弹回来。所以每一帧我都需要更新它的 contentOffset
位置。
解决方法
这就是我所做的:
public protocol FrameUpdator {
func update(delta: TimeInterval)
}
public protocol FrameDriver {
func addUpdator(_ updator: FrameUpdator)
}
open class MyScene: SKScene,FrameDriver,FrameUpdator {
private var prevTime: TimeInterval? = nil
private var frameUpdators: [FrameUpdator] = []
open func update(delta: TimeInterval) {
for updator in frameUpdators {
updator.update(delta: delta)
}
}
public func addUpdator(_ updator: FrameUpdator) {
frameUpdators += [updator]
}
open override func update(_ currentTime: TimeInterval) {
super.update(currentTime)
if let prevTime = prevTime {
let delta = currentTime - prevTime
if delta < 1 { // guard against big delta
update(delta: delta)
}
}
prevTime = currentTime
}
}
现在您可以简单地为您的自定义 SKNode 实现 FrameUpdator
协议,并将其添加到您场景的 frameUpdators
列表中