自定义 SKNode 的 SpriteKit 更新函数

问题描述

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 列表中

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...