【发布时间】:2021-04-18 02:59:08
【问题描述】:
SKScene 有一个update(_ delta: TimeInterval) 函数可用于每帧。我想知道如何为自定义 SKNode 做到这一点?
用例是我正在创建一个 SKScrollView,当用户拖动到滚动视图的边缘时它会反弹回来。所以每一帧我都需要更新它的contentOffset 位置。
【问题讨论】:
标签: sprite-kit skscene sknode
SKScene 有一个update(_ delta: TimeInterval) 函数可用于每帧。我想知道如何为自定义 SKNode 做到这一点?
用例是我正在创建一个 SKScrollView,当用户拖动到滚动视图的边缘时它会反弹回来。所以每一帧我都需要更新它的contentOffset 位置。
【问题讨论】:
标签: sprite-kit skscene sknode
这就是我所做的:
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 列表中
【讨论】: