gpt4 book ai didi

ios - SKLightNode 不使用 SKCameraNode 缩放

转载 作者:可可西里 更新时间:2023-11-01 01:19:38 26 4
gpt4 key购买 nike

在 Sprite Kit 中,我使用 SKCameraNode 来放大和缩小 SKScene。场景中的任何 SKLightNodes 都不会缩放。它们不是 Camera 的子对象,因此不应该是不变的。在此找不到任何内容 - 在 SO 上搜索“SKLightNode SKCameraNode”会产生 0 个结果。

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

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)

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

最佳答案

感谢您提供我们可以测试的示例。通过玩弄它,我可以肯定地看到光线在变大和变小,但变化不大,(如果将相机从位置 (0,0) 移开会更明显)也许苹果端有数学问题,或者绘图顺序优先级问题。

我什至尝试将 SKLightNode 添加到单独的 SKNode,并缩放节点,但结果相同。

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

然后我决定尝试使用较低的 View 大小,当我调整它时发现我能够得到不同的结果。这意味着 SKLightNode 超出了 SKView 的大小,而不是 SKScene 的大小(真的是苹果吗?)。无论是那个还是它脱离了 SKView 提供的上下文。无论哪种方式,看起来您都没有使用 SKLightNode 进行缩放。 (顺便说一句,阴影仍在放大,所以也许您只需要在更好的光照效果下工作?)

关于ios - SKLightNode 不使用 SKCameraNode 缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44489760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com