我在 2020 年 5 月(Xcode 11 和 iOS 13.x)现在尝试做同样的事情,但无法“动画化”模糊半径。就我而言,我从场景完全模糊开始,然后逐渐“取消模糊”(将inputRadius 设置为 0)。
不知何故,自定义动作块中设置的新输入半径值没有反映在渲染场景中。我的代码如下:
private func unblur() {
run(SKAction.customAction(withDuration: unblurDuration, actionBlock: { [weak self] (_, elapsed) in
guard let this = self else { return }
let ratio = (TimeInterval(elapsed) / this.unblurDuration)
let radius = this.maxBlurRadius * (1 - ratio) // goes to 0 as ratio goes to 1
this.filter?.setValue(radius, forKey: kCIInputRadiusKey)
}))
}
我什至尝试使用SKScene.update(_:) 和一些用于记时的变量手动更新值,但结果相同。
我突然想到,如果我将模糊过滤器“重新分配”到我的 SKScene 的 .filter 属性(参见代码末尾附近的所有大写字母中的 cmets),也许我可以强制刷新,相同效果,而且奏效了。
完整代码:
class MyScene: SKScene {
private let maxBlurRadius: Double = 50
private let unblurDuration: TimeInterval = 5
init(size: CGSize) {
super.init(size: size)
let filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(maxBlurRadius, forKey: kCIInputRadiusKey)
self.filter = filter
self.shouldEnableEffects = true
self.shouldRasterize = false
// (...rest of the child nodes, etc...)
}
override func didMove(to view: SKView) {
super.didMove(to: view)
self.unblur()
}
private func unblur() {
run(SKAction.customAction(withDuration: unblurDuration, actionBlock: { [weak self] (_, elapsed) in
guard let this = self else { return }
let ratio = (TimeInterval(elapsed) / this.unblurDuration)
let radius = this.maxBlurRadius * (1 - ratio) // goes to 0 as ratio goes to 1
// OBTAIN THE FILTER
let filter = this.filter
// MODIFY ATTRIBUTE
filter?.setValue(radius, forKey: kCIInputRadiusKey)
// RE=ASSIGN TO SCENE
this.filter = filter
}))
}
}
我希望这对某人有所帮助!