SKLightNode没有使用SKCameraNode进行缩放



在精灵套件中,我使用SKCameraNode来放大和缩小SKScene。场景中的任何 SKLightNode 都不会缩放。它们不是相机的子级,因此不应是不变的。找不到任何内容 - 在SO上搜索"SKLightNode SKCameraNode"产生0个结果。

使用 Xcode 8.3.3 并从基本的 Game/Swift 项目开始,我将 GameScene 中的 sceneDidLoad() 替换为.swift:

override func sceneDidLoad() {
let cameraNode = SKCameraNode()
cameraNode.position = CGPoint(x:0.0, y:0.0)
self.addChild(cameraNode)
self.camera = cameraNode
let bg = SKSpriteNode(color:.red, size:self.size)
bg.lightingBitMask = 0b0001
self.addChild(bg)
let lightNode = SKLightNode()
lightNode.position = CGPoint(x:0.0, y:0.0)
lightNode.categoryBitMask = 0b0001
lightNode.lightColor = .white
lightNode.falloff = 1.0
self.addChild(lightNode)
let zoomDuration:TimeInterval = 10.0
let zoomAction = SKAction.sequence([
SKAction.scale(to:0.25, duration:zoomDuration),
SKAction.scale(to:1.0, duration:zoomDuration)
])
self.camera?.run(zoomAction)
}

如您所见,变焦期间光线保持不变。

为了解决这个问题,我尝试了以下自定义操作来调制光源的衰减属性。这还不错,但这不是忠实的缩放。

let lightAction1 = SKAction.customAction(withDuration: zoomDuration) {
(node, time) -> Void in
let lightNode = node as! SKLightNode
let ratio:CGFloat = time / CGFloat(zoomDuration)
let startFalloff:CGFloat = 1.0
let endFalloff:CGFloat = 0.25
let falloff:CGFloat = startFalloff*(1.0-ratio) + endFalloff*ratio
lightNode.falloff = falloff
}
let lightAction2 = SKAction.customAction(withDuration: zoomDuration) {
(node, time) -> Void in
let lightNode = node as! SKLightNode
let ratio:CGFloat = time / CGFloat(zoomDuration)
let startFalloff:CGFloat = 0.25
let endFalloff:CGFloat = 1.0
let falloff:CGFloat = startFalloff*(1.0-ratio) + endFalloff*ratio
lightNode.falloff = falloff
}
let lightSequence = SKAction.sequence([lightAction1, lightAction2])
lightNode.run(lightSequence)

相机肯定应该放大灯光吗?我错过了什么吗?

编辑:以下建议是一些扩展SKView的代码:

let originalWidth:CGFloat = UIScreen.main.bounds.width
let originalHeight:CGFloat = UIScreen.main.bounds.height
let lightAction1 = SKAction.customAction(withDuration: zoomDuration) {
(node, time) -> Void in
let ratio:CGFloat = time / CGFloat(zoomDuration)
let startFalloff:CGFloat = 1.0
let endFalloff:CGFloat = 1.5
let falloff:CGFloat = startFalloff*(1.0-ratio) + endFalloff*ratio
self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, width: originalWidth*falloff, height: originalHeight*falloff)
}
let lightAction2 = SKAction.customAction(withDuration: zoomDuration) {
(node, time) -> Void in
let ratio:CGFloat = time / CGFloat(zoomDuration)
let startFalloff:CGFloat = 1.5
let endFalloff:CGFloat = 1.0
let falloff:CGFloat = startFalloff*(1.0-ratio) + endFalloff*ratio
self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, width: originalWidth*falloff, height: originalHeight*falloff)
}
let lightSequence = SKAction.sequence([lightAction1, lightAction2])
lightNode.run(lightSequence)

您还需要将相机变焦减半。唯一的问题是一切都被缩放了(甚至是作为子节点添加到 CameraNode 的节点,如分数/按钮)。

我要感谢您提供我们可以测试的示例。 通过玩弄它,我绝对可以看到光线的增长和缩小,但它不是很多,(如果你将相机移开位置(0,0)会更明显)也许苹果端有一个数学问题,或者一个绘图顺序优先级问题。

我甚至尝试将 SKLightNode 添加到单独的 SKNode 中,并扩展节点,但这留下了相同的结果。

我还尝试将场景大小调整为更大的尺寸,结果仍然相同。

然后我决定使用视图大小,低,当我调整它时,我能够得到不同的结果。 这意味着SKLightNode脱离了SKView的大小,而不是SKScene的大小(真的是苹果?)。 要么这样,要么脱离SKView提供的上下文。 无论哪种方式,看起来您都没有使用 SKLightNode 进行缩放。 (顺便说一句,阴影仍然会变焦,所以也许你只需要在更好的照明效果下工作?

相关内容

  • 没有找到相关文章

最新更新