SKLightNode 问题:光照不适用于所有预期的节点
SKLightNode woes: light not applying to all expected nodes
我有一个如下所示的节点树:
LayerWorld
-> layerBackground //contains the map tiles
-> layerUnitSurface //contains all the sprite nodes moving around the map
-> layerOverlay //contains the huds, UI buttons etc
不确定是否相关,但我还根据以下定义使用 .zPosition
控制某些对象的定位:
#define UNITLAYER_ZPOS_PASSENGER -10
#define UNITLAYER_ZPOS_GHOST 001
#define UNITLAYER_ZPOS_BACK 050
#define UNITLAYER_ZPOS_CITY 100
#define UNITLAYER_ZPOS_FRONT 200
#define UNITLAYER_ZPOS_SMOKE 300
#define UNITLAYER_ZPOS_BLAST 400
#define UNITLAYER_ZPOS_HUD 500
#define UILAYER_ZPOS_BUTTONS 1000
在某种 "inspection" 模式下,用户将注意力集中在特定的精灵上,我想突出显示该视图。该单元称为 reconSprite
并添加到 layerUnitSurface
。我想调暗整个背景图,除了精灵的紧邻区域。 SKLightNode
显示发光角色在黑暗地牢中移动的示例正是我要找的。
我显然错误地应用了灯光节点,因为我从未在我的任何图层中看到任何灯光变化。不过,我看不出我做错了什么:
layerBackground.lightingBitMask = 1;
layerBackground.shadowCastBitMask = 0;
layerBackground.shadowedBitMask = 1;
SKLightNode *intelLightSource = [[SKLightNode alloc] init];
intelLightSource.categoryBitMask = 1;
intelLightSource.falloff = 0.5;
intelLightSource.ambientColor = [SKColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.25];
intelLightSource.lightColor = [SKColor colorWithRed:0.8 green:0.8 blue:0.4 alpha:0.8];
intelLightSource.shadowColor = [SKColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
intelLightSource.zPosition = UNITLAYER_ZPOS_SMOKE;
intelLightSource.position = reconSprite.position;
[layerWorld addChild:intelLightSource];
我预计这会使整个地图显得暗淡,在 reconSprite.position
处有一个明亮的区域。但是,没有明显的变化。整个场景保持完全照明。
我知道光源是存在的,因为当我临时加上:
reconSprite.lightingBitMask = 1;
reconSprite.shadowCastBitMask = 1;
reconSprite.shadowedBitMask = 1;
reconSprite 变亮并投下黑色阴影。
问题:为什么我的SKLightNode
影响reconSprite
而不影响整个layerBackground
?
节点不继承其父节点的光照属性。因此,当我将正确的照明属性应用于背景层时,我必须将相同的属性应用于该层中的每个图块。然后它按预期工作。
我有一个如下所示的节点树:
LayerWorld
-> layerBackground //contains the map tiles
-> layerUnitSurface //contains all the sprite nodes moving around the map
-> layerOverlay //contains the huds, UI buttons etc
不确定是否相关,但我还根据以下定义使用 .zPosition
控制某些对象的定位:
#define UNITLAYER_ZPOS_PASSENGER -10
#define UNITLAYER_ZPOS_GHOST 001
#define UNITLAYER_ZPOS_BACK 050
#define UNITLAYER_ZPOS_CITY 100
#define UNITLAYER_ZPOS_FRONT 200
#define UNITLAYER_ZPOS_SMOKE 300
#define UNITLAYER_ZPOS_BLAST 400
#define UNITLAYER_ZPOS_HUD 500
#define UILAYER_ZPOS_BUTTONS 1000
在某种 "inspection" 模式下,用户将注意力集中在特定的精灵上,我想突出显示该视图。该单元称为 reconSprite
并添加到 layerUnitSurface
。我想调暗整个背景图,除了精灵的紧邻区域。 SKLightNode
显示发光角色在黑暗地牢中移动的示例正是我要找的。
我显然错误地应用了灯光节点,因为我从未在我的任何图层中看到任何灯光变化。不过,我看不出我做错了什么:
layerBackground.lightingBitMask = 1;
layerBackground.shadowCastBitMask = 0;
layerBackground.shadowedBitMask = 1;
SKLightNode *intelLightSource = [[SKLightNode alloc] init];
intelLightSource.categoryBitMask = 1;
intelLightSource.falloff = 0.5;
intelLightSource.ambientColor = [SKColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.25];
intelLightSource.lightColor = [SKColor colorWithRed:0.8 green:0.8 blue:0.4 alpha:0.8];
intelLightSource.shadowColor = [SKColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
intelLightSource.zPosition = UNITLAYER_ZPOS_SMOKE;
intelLightSource.position = reconSprite.position;
[layerWorld addChild:intelLightSource];
我预计这会使整个地图显得暗淡,在 reconSprite.position
处有一个明亮的区域。但是,没有明显的变化。整个场景保持完全照明。
我知道光源是存在的,因为当我临时加上:
reconSprite.lightingBitMask = 1;
reconSprite.shadowCastBitMask = 1;
reconSprite.shadowedBitMask = 1;
reconSprite 变亮并投下黑色阴影。
问题:为什么我的SKLightNode
影响reconSprite
而不影响整个layerBackground
?
节点不继承其父节点的光照属性。因此,当我将正确的照明属性应用于背景层时,我必须将相同的属性应用于该层中的每个图块。然后它按预期工作。