SKLightNode не масштабирует с помощью SKCameraNode ⇐ IOS
-
Гость
SKLightNode не масштабирует с помощью SKCameraNode
В Sprite Kit я использую SKCameraNode для увеличения и уменьшения масштаба SKScene. Любые SKLightNodes в сцене вообще не масштабируются. Они не являются дочерними элементами Камеры, поэтому не должны быть инвариантными. Ничего не могу найти по этому поводу. Поиск «SKLightNode SKCameraNode» в SO дает 0 результатов.
Используя Xcode 8.3.3 и начиная с базового проекта Game/Swift, я заменил SceneDidLoad() в GameScene.swift на:
переопределить функцию SceneDidLoad() { пусть cameraNode = SKCameraNode() cameraNode.position = CGPoint(x:0.0, y:0.0) self.addChild(cameraNode) self.camera = узел камеры let bg = SKSpriteNode(цвет:.красный, размер: self.size) bg.lightingBitMask = 0b0001 self.addChild(бг) пусть LightNode = SKLightNode() LightNode.position = CGPoint(x:0.0, y:0.0) LightNode.categoryBitMask = 0b0001 LightNode.lightColor = .белый LightNode.falloff = 1,0 self.addChild(lightNode) пусть ZoomDuration:TimeInterval = 10,0 пусть ZoomAction = SKAction.sequence([ SKAction.scale(до:0,25, продолжительность:zoomDuration), SKAction.scale(to:1.0, продолжительность:zoomDuration) ]) self.camera?.run(zoomAction) } Как видите, при увеличении свет не меняется.
Пытаясь решить эту проблему, я попробовал следующее пользовательское действие, чтобы модулировать свойство спада света. Вроде бы нормально, но это не точный зум.
let LightAction1 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в пусть LightNode = узел как! SKLightNode let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.0 пусть endFalloff:CGFloat = 0,25 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент LightNode.falloff = спад } let LightAction2 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в пусть LightNode = узел как! SKLightNode let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 0,25 пусть endFalloff:CGFloat = 1.0 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент LightNode.falloff = спад } let LightSequence = SKAction.sequence([lightAction1, LightAction2]) LightNode.run(lightSequence) Наверняка камера должна увеличивать свет? Я что-то упустил?
РЕДАКТИРОВАТЬ: следующие предложения ниже - это код, который масштабирует SKView:
let originalWidth:CGFloat = UIScreen.main.bounds.width пусть originalHeight:CGFloat = UIScreen.main.bounds.height let LightAction1 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.0 пусть endFalloff:CGFloat = 1,5 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, ширина: originalWidth*falloff, высота: originalHeight*falloff) } let LightAction2 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.5 пусть endFalloff:CGFloat = 1.0 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, ширина: originalWidth*falloff, высота: originalHeight*falloff) } let LightSequence = SKAction.sequence([lightAction1, LightAction2]) LightNode.run(lightSequence) Вам также потребуется уменьшить масштаб камеры вдвое. Единственная проблема заключается в том, что все масштабируется (даже узлы, добавленные в качестве дочерних элементов к CameraNode, например баллы/кнопки).
В Sprite Kit я использую SKCameraNode для увеличения и уменьшения масштаба SKScene. Любые SKLightNodes в сцене вообще не масштабируются. Они не являются дочерними элементами Камеры, поэтому не должны быть инвариантными. Ничего не могу найти по этому поводу. Поиск «SKLightNode SKCameraNode» в SO дает 0 результатов.
Используя Xcode 8.3.3 и начиная с базового проекта Game/Swift, я заменил SceneDidLoad() в GameScene.swift на:
переопределить функцию SceneDidLoad() { пусть cameraNode = SKCameraNode() cameraNode.position = CGPoint(x:0.0, y:0.0) self.addChild(cameraNode) self.camera = узел камеры let bg = SKSpriteNode(цвет:.красный, размер: self.size) bg.lightingBitMask = 0b0001 self.addChild(бг) пусть LightNode = SKLightNode() LightNode.position = CGPoint(x:0.0, y:0.0) LightNode.categoryBitMask = 0b0001 LightNode.lightColor = .белый LightNode.falloff = 1,0 self.addChild(lightNode) пусть ZoomDuration:TimeInterval = 10,0 пусть ZoomAction = SKAction.sequence([ SKAction.scale(до:0,25, продолжительность:zoomDuration), SKAction.scale(to:1.0, продолжительность:zoomDuration) ]) self.camera?.run(zoomAction) } Как видите, при увеличении свет не меняется.
Пытаясь решить эту проблему, я попробовал следующее пользовательское действие, чтобы модулировать свойство спада света. Вроде бы нормально, но это не точный зум.
let LightAction1 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в пусть LightNode = узел как! SKLightNode let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.0 пусть endFalloff:CGFloat = 0,25 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент LightNode.falloff = спад } let LightAction2 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в пусть LightNode = узел как! SKLightNode let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 0,25 пусть endFalloff:CGFloat = 1.0 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент LightNode.falloff = спад } let LightSequence = SKAction.sequence([lightAction1, LightAction2]) LightNode.run(lightSequence) Наверняка камера должна увеличивать свет? Я что-то упустил?
РЕДАКТИРОВАТЬ: следующие предложения ниже - это код, который масштабирует SKView:
let originalWidth:CGFloat = UIScreen.main.bounds.width пусть originalHeight:CGFloat = UIScreen.main.bounds.height let LightAction1 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.0 пусть endFalloff:CGFloat = 1,5 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, ширина: originalWidth*falloff, высота: originalHeight*falloff) } let LightAction2 = SKAction.customAction(withDuration: ZoomDuration) { (узел, время) -> Пустота в let соотношение:CGFloat = время / CGFloat(zoomDuration) пусть startFalloff:CGFloat = 1.5 пусть endFalloff:CGFloat = 1.0 let Falloff:CGFloat = startFalloff*(1.0-коэффициент) + endFalloff*коэффициент self.view?.frame = CGRect(x: (originalWidth-originalWidth*falloff)/2.0, y: (originalHeight-originalHeight*falloff)/2.0, ширина: originalWidth*falloff, высота: originalHeight*falloff) } let LightSequence = SKAction.sequence([lightAction1, LightAction2]) LightNode.run(lightSequence) Вам также потребуется уменьшить масштаб камеры вдвое. Единственная проблема заключается в том, что все масштабируется (даже узлы, добавленные в качестве дочерних элементов к CameraNode, например баллы/кнопки).
Мобильная версия