У меня не получилось получить SKSpriteNode, чтобы отбросить тень, а также исчезнуть при входе в тень от того же источника света. Я могу сделать один из двух, но не оба.SKLightNode cast shadow issue
В соответствии с документами: Если спрайт находится внутри тени, отлитой от света, а спрайт имеет более низкое положение z, чем свет, тень влияет на то, как спрайт горит. Все, что я сделал. Мой SKLightNode имеет zPosition 100, а все остальные узлы имеют более низкие значения zPosition.
Я пробовал любые комбинации настроек для lightingBitMask, shadowCastBitMask и shadowedBitMask, но ничего не сработало.
Я размещаю изолированный код, который воссоздает мою проблему. Синяя коробка бросает тень, но не покрывается тенью стены. Фиолетовая коробка не оставляет тени и закрыта тенью стены.
Свет реагирует на движение касания, поэтому не стесняйтесь перемещать его по экрану. Проект находится в ландшафтном режиме.
Что мне не хватает или не вижу?
#import "GameScene.h"
@implementation GameScene {
SKSpriteNode *lightBulb;
}
-(void)didMoveToView:(SKView *)view {
typedef NS_OPTIONS(uint32_t, Level1LightCategory)
{
CategoryLightPlayer = 1 << 0,
};
SKSpriteNode *worldNode = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(1136, 640)];
worldNode.zPosition = 10;
//worldNode.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild:worldNode];
lightBulb = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(20, 20)];
lightBulb.zPosition = 100;
lightBulb.position = CGPointMake(50, 50);
[worldNode addChild:lightBulb];
SKLightNode *light = [[SKLightNode alloc] init];
//light.zPosition = 100; // <- tried setting this again but to no effect
light.categoryBitMask = CategoryLightPlayer;
light.falloff = 0.3;
light.ambientColor = [UIColor whiteColor];
light.lightColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
light.shadowColor = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
[lightBulb addChild:light];
SKSpriteNode *wall = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(10, 300)];
wall.zPosition = 50;
wall.position = CGPointMake(500, 200);
wall.lightingBitMask = CategoryLightPlayer;
wall.shadowCastBitMask = CategoryLightPlayer;
wall.shadowedBitMask = 0x00000000;
[worldNode addChild:wall];
SKSpriteNode *box0 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(30, 30)];
box0.zPosition = 40;
box0.position = CGPointMake(800, 200);
box0.lightingBitMask = CategoryLightPlayer;
box0.shadowCastBitMask = CategoryLightPlayer;
box0.shadowedBitMask = CategoryLightPlayer;
[worldNode addChild:box0];
SKSpriteNode *box1 = [SKSpriteNode spriteNodeWithColor:[SKColor purpleColor] size:CGSizeMake(30, 30)];
box1.zPosition = 40;
box1.position = CGPointMake(800, 300);
box1.lightingBitMask = CategoryLightPlayer;
//box1.shadowCastBitMask = CategoryLightPlayer;
//box1.shadowedBitMask = CategoryLightPlayer;
[worldNode addChild:box1];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self.scene];
lightBulb.position = touchLocation;
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self.scene];
lightBulb.position = touchLocation;
}
-(void)update:(CFTimeInterval)currentTime {
//
}
@end
Я проверил это, используя Xcode 8.3.2, и, похоже, он исправлен. Я помещаю ваш код в примерный проект, и отбрасывание тени из стены над синим ящиком скрывает его, как ожидалось. Синяя коробка также по-прежнему бросает свою тень, когда она не закрыта тенью стены. Возможно, это было исправлено в недавнем обновлении SK или, возможно, я не понимаю вашу проблему. – Jonathan